小编kws*_*wsp的帖子

C++ 初始化时对变量的引用

考虑这个例子:

#include <iostream>

std::string& fn(std::string& str) {
    str = "oh no!";
    return str;
}

int main() {
    std::string str = fn(str);
    std::cout << str << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我有两个问题

  1. 为什么这个编译/为什么编译器不警告它?显然,在初始化之前str不应(在函数调用中)引用它。fnC++ 标准不阻止这种情况吗?如果是这样,在初始化变量之前引用变量的目的是什么?

  2. 这段代码在我尝试过的所有编译器(GCC、Clang 和 MSVC,如https://godbolt.org/z/jExWYW6b9所示)上编译良好,并且在 Godbolt 上的所有编译器上都存在段错误。但是,我可以编译此代码并在 M1 mac 上执行,而不会出现段错误Apple clang version 13.1.6 (clang-1316.0.21.2.5)(使用 Rosetta 2 在 arm64 和 x86_64 下进行测试,并打印oh no!到标准输出)。为什么这可以与 Apple Clang 一起使用并且不会出现段错误?我似乎无法在 Godbolt 上重现这一点。

c++ clang++

8
推荐指数
1
解决办法
233
查看次数

Numba np.convolve 非常慢

我正在尝试加速一段将一维数组(过滤器)与二维数组的每一列进行卷积的代码。不知何故,当我用 numba's 运行它时njit,速度减慢了 7 倍。我的想法:

\n
    \n
  • 也许列索引会减慢速度,但切换到行索引并不会影响性能
  • \n
  • 也许切片索引卷积结果很慢,但删除它并没有改变任何东西
  • \n
  • 我已经检查过 numba 是否正确理解所有类型
  • \n
\n

(在 Windows 10、conda 的 python 3.9.4、numpy 1.12.2、numba 0.53.1 上测试)

\n

谁能告诉我为什么这段代码很慢?

\n
import numpy as np\nfrom numba import njit\n\ndef f1(a1, filt):\n    l2 = filt.size // 2\n    res = np.empty(a1.shape)\n    for i in range(a1.shape[1]):\n        res[:, i] = np.convolve(a1[:, i], filt)[l2:-l2]\n    return res\n\n@njit\ndef f1_jit(a1, filt):\n    l2 = filt.size // 2\n    res = np.empty(a1.shape)\n    for i in range(a1.shape[1]):\n        res[:, i] = np.convolve(a1[:, i], filt)[l2:-l2]\n    return …
Run Code Online (Sandbox Code Playgroud)

python arrays performance numpy numba

6
推荐指数
1
解决办法
1787
查看次数

如何在 Common Lisp 中输入 DO 变量?

我知道你可以声明函数参数类型,例如

(defun add-integer (a b)
  (declare (integer a b))
  (the integer (+ a b)))
Run Code Online (Sandbox Code Playgroud)

但是 DO 变量呢?例如,我想输入passes

(defun bench ()
  (do ((end (+ (get-internal-real-time) (* 5 internal-time-units-per-second)))
       (passes 0 (+ 1 passes)))
      ((> (get-internal-real-time) end)
       passes)
    (sieve 1000000)))
Run Code Online (Sandbox Code Playgroud)

当我尝试使用 进行编译时(declaim (optimize (speed 2) (safety 0))),我得到

; in: DEFUN BENCH
;     (1+ PASSES)
; 
; note: forced to do full call
;       unable to do inline fixnum arithmetic (cost 2) because:
;       The first argument is a …
Run Code Online (Sandbox Code Playgroud)

common-lisp

2
推荐指数
1
解决办法
77
查看次数

标签 统计

arrays ×1

c++ ×1

clang++ ×1

common-lisp ×1

numba ×1

numpy ×1

performance ×1

python ×1