Python中变量赋值运算为何比Numpy数组操作执行速度更快?
复现性说明
你观测到的现象是完全可复现的,test2远快于test1的运行结果符合预期。
速度差异原因
两者的性能差距本质是使用numpy的方式不对,没有发挥它的优势反而承担了额外开销:
- numpy的数组运算为了适配各种长度、各种维度的通用场景,内置了类型校验、内存对齐、广播逻辑适配、多线程调度判断等额外步骤,这些步骤在处理长度仅为3的小数组时,开销占比远高于运算本身的耗时。而test2中的所有操作都是Python标量运算,不存在这类额外开销。
- test1每次循环都需要执行
np.array([1,1,1])创建新的numpy数组,仅这一步的耗时就远高于test2里直接给三个标量变量赋值1的操作。 - 你当前的两个实现都是在Python层做循环遍历每个坐标点,Python层循环本身执行效率很低,test1在慢循环里还叠加了numpy的多步额外开销,自然远慢于test2在循环里仅做轻量标量运算的实现。
优化参考
numpy的核心优势是向量化批量运算,你可以把整个计算逻辑搬到numpy底层执行,完全避免Python层循环,性能会比test2还要高得多,参考实现如下:
def test3(coords): # 整个数组批量运算,循环在C层执行 squared_diff = (coords - np.array([1,1,1])) ** 2 squared_sum = np.sum(squared_diff, axis=1) return np.sqrt(squared_sum).tolist()
在相同测试数据下,这个实现的耗时会远低于你给出的两个测试用例。
内容的提问来源于stack exchange,提问作者Jacob Bumgarner
相关产品推荐
相关产品推荐

