假设我想在Python中创建一个包含1000000个2的数组(而不是列表),像这样:
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.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)
非常棒!
a = 2 * ones(1000000)
。 - Philipptimeit
进行简单的计时(a),以及测量时间有多小(毫秒!)(b)(4年前的笔记本电脑运行Win XP SP2)。 - John MachinaList = [2 for x in range(1000000)]
或者基于Chauncey的链接
anArray =array.array('i', (2 for i in range(0,1000000)))
myarray = array.array('L')
f = open('/dev/zero', 'rb')
myarray.fromfile(f, size)
f.close()
array = [2 for x in 1..1000000]
? - Michael Myers[2 for x in xrange(1000000)]
;[2] * 1000000
更快更简单;但这些会产生一个list
-- 在 Python 中,array
和list
意思不同。 - John Machin