【发布时间】:2011-09-27 10:01:09
【问题描述】:
我对此感到困惑
def main():
for i in xrange(2560000):
a = [0.0, 0.0, 0.0]
main()
$ time python test.py
real 0m0.793s
现在让我们用 numpy 来看看:
import numpy
def main():
for i in xrange(2560000):
a = numpy.array([0.0, 0.0, 0.0])
main()
$ time python test.py
real 0m39.338s
神圣的 CPU 循环蝙蝠侠!
使用numpy.zeros(3) 会有所改善,但恕我直言仍然不够
$ time python test.py
real 0m5.610s
user 0m5.449s
sys 0m0.070s
numpy.version.version = '1.5.1'
如果您想知道在第一个示例中是否跳过列表创建进行优化,它不是:
5 19 LOAD_CONST 2 (0.0)
22 LOAD_CONST 2 (0.0)
25 LOAD_CONST 2 (0.0)
28 BUILD_LIST 3
31 STORE_FAST 1 (a)
【问题讨论】:
-
快速思考:
numpy.array实际上是一个比列表更复杂的数据结构。在第二个 sn-p 中,您创建一个列表和一个 numpy 数组(在第一个中只有一个列表)。这是否是造成如此大差异的唯一原因,我不能说。 -
@Felix:好的,但是列表的创建速度很快,所以即使我在第二种情况下创建了一个列表和一个numpy数组,这里的热点仍然是numpy创建,而且无论结构多么复杂,它仍然非常昂贵......
-
但请考虑:在使用 numpy 的复杂应用程序中,创建数据很少是瓶颈。我也不知道幕后发生了什么,但它显然使数学繁重的程序在一天结束时变得更快,所以没有理由抱怨;)
-
@Stefano:你不是在计时中包括了 numpy 的导入吗? (python 也有一个内置的计时模块。)
-
快速提示,您可以使用
python -mtimeit test.py进行基准测试。
标签: python performance numpy