创建包含数百万个元素的列表

时间:2017-01-02 14:32:45

标签: arrays performance python-3.x

我需要创建和处理包含2 ** 30个元素的列表,但它要慢一些。有什么形式可以提高速度吗?

我的代码:

sup = []

for i in range(2**30):
    sup.append([i,pow(y,i,N)])

pow(y,i,n)== y ** i * mod(N),模幂运算

我尝试使用列表推导但还不够。

2 个答案:

答案 0 :(得分:3)

不同的方法:为什么要在列表中存储这些数字?

你的配方就在那里;每当某段代码需要sup [i];你只需计算 pow(y,i,N)。

换句话说:而不是在列表中存储值;只需在需要时计算它们。

编辑:因为您似乎有充分的理由将数据存储在数组中;然后我会说:然后使用适当的工具。

含义:您不是直接使用python计算强烈的事物,而是查看numpy框架。该框架设计正是出于这样的目的。除此之外,我还会考虑您存储/准备数据的方式。示例:您提到以后在该数组中查找相同的条目。我想知道这是否意味着你应该使用字典而不是列表;或者你真的打算每次寻找相同的战俘价值时检查2 ** 30个条目吗?

答案 1 :(得分:0)

通过您的评论并补充GhostCat的答案,直接转到您要查找的数据,例如

>>> from collections import defaultdict
>>> y = 2
>>> N = 10
>>> data = defaultdict(list)
>>> for i in range(100):
        data[pow(y,i,N)].append(i)


>>> for x in data.items():
        x


(8, [3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47, 51, 55, 59, 63, 67, 71, 75, 79, 83, 87, 91, 95, 99])
(1, [0])
(2, [1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45, 49, 53, 57, 61, 65, 69, 73, 77, 81, 85, 89, 93, 97])
(4, [2, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46, 50, 54, 58, 62, 66, 70, 74, 78, 82, 86, 90, 94, 98])
(6, [4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 92, 96])
>>> 

或者更具体地说,因为你需要random sample从一开始就去做它,而不是浪费时间来制作你不需要的大量东西,例如

>>> import random
>>> random_data = defaultdict(list)
>>> for i in random.sample(range(2**30), 20):
        random_data[pow(2,i,10)].append(i)


>>> for x in random_data.items():
        x


(8, [633728687, 357300263, 208747091, 456291987, 1028949643, 23961003, 750842555])
(2, [602395153, 215460881, 144481457, 829193705])
(4, [752840814, 26689262])
(6, [423520476, 969809132, 326786996, 736424520, 929123176, 865279408, 338237708])
>>> 

并且取决于你以后对那些i做什么,你可以尝试一种更加数学的方法来揭示产生i的底层模式,其中y i mod N是相同的,并且您可以根据需要为该特定模块类生成尽可能多的i

对于这个例子来说很容易,它是

对于所有i = 3(模4) - > 2,

2 i = 8(mod 10)。 range(3,2**30,4)

所有i = 1(mod 4)的

2 i = 2(mod 10) - > range(1,2**30,4)

2 i = 4(mod 10),对于所有i = 2(mod 4) - > range(2,2**30,4)

2 i = 6(mod 10),对于所有i = 0(mod 4) - > range(4,2**30,4)

对于i = 0

2 i = 1(mod 10)