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

6

假设我想在Python中创建一个包含1000000个2的数组(而不是列表),像这样:

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

有什么快速而简单的方法吗?


1
我几乎不懂Python,但它可能是这样的吗:array = [2 for x in 1..1000000] - Michael Myers
这个之前的问题可能会有所帮助 - https://dev59.com/k3I-5IYBdhLWcg3wbXtN - chauncey
@mmyers:您的建议不是有效的语法;您可能是指 [2 for x in xrange(1000000)][2] * 1000000 更快更简单;但这些会产生一个 list -- 在 Python 中,arraylist 意思不同。 - John Machin
@John:mmyers曾表示他实际上不懂Python。所以别再吹毛求疵了 :) 当然感谢建议。 - Vijay Dev
可能是 [NumPy数组初始化(填充相同值)] 的重复问题(https://dev59.com/lm025IYBdhLWcg3wpHh-)。 - Nico Schlömer
显示剩余2条评论
6个回答

18

目前被接受的回答并不是使用 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的比率...


+1,我已经更新了我的答案,并添加了另一种语法和注释。谢谢你指出来。 - g.d.d.c
1
慢慢的 :) ... 两个版本的混合更好 - John La Rooy

9
这是你想要的吗?
# slower.
twosArr = array.array('i', [2] * 1000000)

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

您可以使用以下代码获取列表:
twosList = [2] * 1000000

--编辑--

我更新了这篇文章以反映另一个答案中的信息。通过略微调整语法,您似乎可以将速度提高大约9:1的比例。完全归功于@john-machin。我不知道您可以像对列表一样对数组对象进行相同的乘法运算。


5

对我来说,混合方法工作最快。

$ 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

3
使用timeit模块,您可以找出这样做最的方法:
首先,将这么多数字放在列表中会消耗大量内存,很可能导致计算机崩溃。
但是,您可以使用以下方式测试执行速度。在我的电脑上运行了很长时间,我只好放弃,但我用的是较老的电脑:
timeit.Timer('[2] * 1000000').timeit()

您可以考虑使用array模块来实现,它是用于存储数字值的高效数组

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)

非常棒!


1
Numpy还有专门的工厂函数:a = 2 * ones(1000000) - Philipp
@Philipp:太棒了!这就是我喜欢 Stack Overflow 的原因。好奇心驱使我回答问题,从中学到了很多东西。干杯 :-) - Bartek
如果你无法将一个百万元素的列表或数组装入计算机的内存中,那么它已经死了。此外,我不理解“它在我的电脑上运行了很长时间”...请参见我的答案,了解如何使用命令提示符下的timeit进行简单的计时(a),以及测量时间有多小(毫秒!)(b)(4年前的笔记本电脑运行Win XP SP2)。 - John Machin

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

或者基于Chauncey的链接

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

1
如果初始值可以为零,且您的平台上有 /dev/zero,那么以下方法比数组('L',[0])*size解决方案快约4.7倍:
myarray = array.array('L')
f = open('/dev/zero', 'rb')
myarray.fromfile(f, size)
f.close()

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接