小编2xB*_*2xB的帖子

对几乎相同的代码执行不同的向量求和

使用g++flag编译时,这些对数组和向量求和的函数之间似乎存在性能差异-O3

float sum1(float* v, int length) {
    float sum = 0;
    for(int i = 0; i < length; i++) {
        sum += v[i];
    }
    return sum;
}

float sum2(std::vector<float> v) {
    return sum1(&v[0], v.size());
}
Run Code Online (Sandbox Code Playgroud)

sum1使用例如长度为 100000 和sum2具有相同长度和内容的向量调用时,sum2最终大约为。比sum1我的测试慢 10% 。测量的运行时间是:

sum1: 0.279816 ms
sum2: 0.307811 ms
Run Code Online (Sandbox Code Playgroud)

现在这个开销从何而来?附加您还可以找到我在那里犯错误的可能性的完整测试代码。

[更新]通过引用 ( float sum2(std::vector<float>& v))调用时,性能差异约为 . 还剩下 3.7%,所以这会有所帮助,但在其他地方仍有一些性能损失?

[更新 2]其余的似乎在统计上占主导地位,从更多的迭代中可以看出。因此,唯一的问题确实是通过引用调用!


完整的测试代码(编译标志-O3g++,也与测试clang++):

sum1: …
Run Code Online (Sandbox Code Playgroud)

c++ arrays performance vector stdvector

3
推荐指数
1
解决办法
124
查看次数

如何在Python中调用默认的字符串相等函数?

我会假设:

import numpy as np
a = np.array(["a", "b", "c"])
print(a == "abc")
print("abc" == a)
Run Code Online (Sandbox Code Playgroud)

输出

[False False False]
False
Run Code Online (Sandbox Code Playgroud)

,因为后者的比较应该为字符串使用相等的定义,而前者的比较应该为NumPy数组使用相等的定义。

实际输出为:

[False False False]
[False False False]
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况[1],如何防止这种情况发生[2]?

[1]即为什么str.__eq__ NotImplemented

[2]也就是说,如果np.ndarray.__eq__不执行,如何调用执行的相等性检查?

[编辑]该问题被标记为与elementwise比较字符串1-d numpy数组可能重复,但不是,因为提出了完全相反的要求(基本上是如何使用np.ndarray.__eq__),并且[1]和[2]都不是讨论过。

python equality operators python-3.x

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