我最近在学习python,并且正在使用该语言进行许多练习.
我发现有趣的一点是,当我从数组中读取时,它几乎比列表慢一半的时间.有人知道为什么吗?
这是我的代码:
from timeit import Timer
import array
t = 10000
l = range(t)
a = array.array('i', l)
def LIST():
for i in xrange(t):
l[i]
def ARRAY():
for i in xrange(t):
a[i]
print Timer(LIST).timeit(1000);
print Timer(ARRAY).timeit(1000);
输出是:
0.813191890717 1.16269612312
表示读取数组比列表慢.我认为数组是一个固定大小的内存,而list是一个动态结构.所以我假设数组比列表更快.
有没有人有任何解释?
lists是"动态增长的向量"(非常类似于C++ std::vector),但这绝不会减慢对它们的随机访问速度(它们不是链表! - ).列表的条目是对Python对象(项目)的引用:访问一个只需要(在CPython中)项目引用计数的增量(在其他实现中,基于更高级的垃圾收集,甚至不是;-).数组的条目是原始位和字节:访问一个条目需要根据该二进制值合成一个全新的Python对象.例如:
$ python -mtimeit -s'import array; c=array.array("B", "bzap")' 'c[2]'
10000000 loops, best of 3: 0.0903 usec per loop
$ python -mtimeit -s'c=list("bzap")' 'c[2]'
10000000 loops, best of 3: 0.0601 usec per loop
Run Code Online (Sandbox Code Playgroud)
30纳秒的额外访问时间似乎并不太糟糕;-).
timeit顺便说一句,注意从命令行使用更好 - 自动选择重复,时间显示的度量单位等.这就是我总是使用它的方式(导入一个带有被调用函数的自定义编码模块)如果需要的话-但这里有没有必要的) -它是如此不是导入并使用它从一个模块要容易上手得多!
将原始整数包装到Python中需要花费时间int.