繁体   English   中英

在python中初始化整数数组的最快方法是什么?

[英]What is the fastest way to initialize an integer array in python?

假设我想在 python 中创建一个包含 1,000,000 个二进制的数组(不是列表),如下所示:

array = [2, 2, 2, ...... , 2]

什么是快速但简单的方法?

当前接受的答案不是使用array.array的最快方法; 至少它不是最慢的——比较这些:

[source: johncatfish (quoting chauncey), Bartek]
python -m timeit -s"import array" "arr = array.array('i', (2 for i in range(0,1000000)))"
10 loops, best of 3: 543 msec per loop

[source: g.d.d.c]
python -m timeit -s"import array" "arr = array.array('i', [2] * 1000000)"
10 loops, best of 3: 141 msec per loop

python -m timeit -s"import array" "arr = array.array('i', [2]) * 1000000"
100 loops, best of 3: 15.7 msec per loop

这是大约 9 比 1 的比率......

这是你追求的吗?

# slower.
twosArr = array.array('i', [2] * 1000000)

# faster.
twosArr = array.array('i', [2]) * 1000000

你可以得到一个列表:

twosList = [2] * 1000000

-- 编辑 --

我更新了这个以反映另一个答案中的信息。 看起来您可以通过稍微调整语法以大约 9 : 1 的比例提高速度。 全部功劳属于@john-machin。 我不知道您可以像处理列表一样对数组对象进行多重处理。

混合方法对我来说效果最快

$ python -m timeit -s"import array" "arr = array.array('i', [2]*100) * 10000"
100 loops, best of 3: 5.38 msec per loop

$ python -m timeit -s"import array" "arr = array.array('i', [2]) * 1000000"
10 loops, best of 3: 20.3 msec per loop
$ python -m timeit -s"import array" "arr = array.array('i', [2]*10) * 100000"
100 loops, best of 3: 6.69 msec per loop
$ python -m timeit -s"import array" "arr = array.array('i', [2]*100) * 10000"
100 loops, best of 3: 5.38 msec per loop
$ python -m timeit -s"import array" "arr = array.array('i', [2]*1000) * 1000"
100 loops, best of 3: 5.47 msec per loop
$ python -m timeit -s"import array" "arr = array.array('i', [2]*10000) * 100"
100 loops, best of 3: 6.13 msec per loop
$ python -m timeit -s"import array" "arr = array.array('i', [2]*100000) * 10"
10 loops, best of 3: 14.9 msec per loop
$ python -m timeit -s"import array" "arr = array.array('i', [2]*1000000)"
10 loops, best of 3: 77.7 msec per loop

使用timeit模块,您可以找出最快的方法是什么:

首先,将这么多数字放在列表中很可能会杀死您的机器,因为它会将其存储在内存中。

但是,您可以使用类似的方法测试执行。 在我放弃之前它在我的电脑上运行了很长时间,但我在一台旧电脑上:

timeit.Timer('[2] * 1000000').timeit()

您可以研究的另一个选项是使用数组模块,如前所述, efficient arrays of numeric values

array.array('i', (2 for i in range(0, 1000000)))

我没有测试两者的完成时间,但我确信专为数字集设计的array模块会更快。

编辑:更有趣的是,您可以看看实际上似乎执行速度最快的numpy

from numpy import *
array( [2 for i in range(0, 1000000)])

从评论中更快:

a = 2 * ones(10000000)

惊人的!

aList = [2 for x in range(1000000)]

或基于昌西链接

anArray =array.array('i', (2 for i in range(0,1000000)))

如果初始值不必非零,并且您的平台上有 /dev/zero 可用,则以下解决方案比 array('L',[0])*size 解决方案快约 4.7 倍:

myarray = array.array('L')
f = open('/dev/zero', 'rb')
myarray.fromfile(f, size)
f.close()

在问题如何在 Python 中用零初始化整数 array.array 对象我正在寻找更好的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM