2010-07-09 75 views
3

说我想在Python中创建一个数组1,000,000三三两两(未列出),像这样:什么是在python中初始化整数数组的最快方法?

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

会是什么做的一个快速而简单的方法是什么?

+1

我几乎不知道Python,但它可能是'array = [2 for x in 1..1000000]''? – 2010-07-09 15:52:51

+0

这个前面的问题可能有所帮助 - http://stackoverflow.com/questions/1859864/how-to-create-an-integer-array-in-python – chauncey 2010-07-09 15:52:57

+0

@mmyers:你的建议是无效的语法;你可能意指'[2 for xrange in xrange(1000000)]'; '[2] * 1000000'会更快更简单;但是这些产生'list' - 'array'和'list'在Python中意味着不同的东西。 – 2010-07-09 20:47:46

回答

6

这是你在追求什么?

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

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

你可以利用这个得到的只是一个列表:

twosList = [2] * 1000000 

- 编辑 -

我更新这反映了另一个答案的信息。通过略微调整语法,您可以将速度提高〜9:1。完整的功劳属于@ john-machin。我不知道你可以像对列表一样对数组对象进行多重处理。

+0

slooooo ...看我的回答 – 2010-07-09 20:31:15

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

或比卢普斯链接

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

使用timeit模块的基础,你可以种搞清楚这样做的最快是:

首先,把许多数字在列表中会最有可能杀死你的机器,因为它会将它存储在内存中。

但是,你可以使用像这样的东西来测试执行。它跑到我的电脑很长一段时间之前,我只是放弃了,但我的旧电脑:

你可以看看
timeit.Timer('[2] * 1000000').timeit() 

疗法另一种选择是使用array模块,它是说,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) 

Awesmoe!

+1

numpy也有专门的工厂函数:'a = 2 * ones(1000000)' – Philipp 2010-07-09 16:27:49

+0

@Philipp:太棒了!这就是我喜欢SO的原因。好奇心回答一个问题导致了我自己的许多学习。欢呼声:-) – Bartek 2010-07-09 16:29:02

+0

如果你无法将百万元素的列表或数组放入你的机器内存,它已经死了。此外,我不明白“它长时间在我的电脑上运行”......查看我的答案(a)如何在命令提示符下使用'timeit'进行简单的计时(b)测量时间毫秒!)是(运行Win XP SP2的4岁笔记本电脑) – 2010-07-09 20:35:46

11

目前接受的答案不是使用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 ...

+0

+1,我用其他语法和注释更新了我的答案。谢谢你指出。 – 2010-07-09 20:44:52

+1

slooow :) ...这两个版本的混合比较好 – 2013-05-21 02:37:03

2

混合方法最快的作品对我来说

$ 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 
0

如果初始值并不一定是非零和,如果您有/开发/零您的平台上,以下是大于阵列( 'L',[0])*尺寸的解决方案快约4.7倍:

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

在问题How to initialise an integer array.array object with zeros in Python我正在寻找更好的方法。

相关问题