python中的元组大小是否有限制?

时间:2015-11-10 16:03:04

标签: python loops multidimensional-array tuples

我想为神经网络组装一套训练集。我有一个1017209行和7列的大型csv文件。我需要从这个文件中提取某些特性,并将它们放入元组中。我这样做的方式如下:

import pandas as pd

data = pd.read_csv('data.csv', index_col=False, header=0)
matrix = data.as_matrix()

training_data = ()

for x in range(1017209):
    a = np.ndarray((3,1), buffer=np.array([matrix[x][0],matrix[x][1],matrix[x][5]]), dtype=float)
    b = np.ndarray((1,1), buffer=np.array(matrix[x][3]), dtype=float)
    training_data = training_data + ((a,b),)

当我循环大约100000时它可以工作:

for x in range(100000)

但不是全套:

for x in range(1017209)

我在spyder中运行它。它没有破坏,但似乎也没有完成。当我设置为100000时,它会在大约一分钟内完成。当我设置为1017209时,即使在45分钟内也没有完成。

可能会发生什么? 为什么我没有收到错误消息? 有没有更好的方法来创建相同的元组?

1 个答案:

答案 0 :(得分:2)

我认为C32遇到了这个问题(虽然他出于某种原因在评论中回答了这个问题)。由于元组是不可变的,所以每次都必须创建一个新的元组而不是附加到现有的元组。这会给你二次行为,如果你让你的元组长10倍,它会花费100倍的时间。您的代码可能会在大约100分钟左右完成。例如:

def build_tup(n):
    td = ()
    for i in range(n):
        td = td + ((1,2),)
    return td    

def add_to_list(n):
    td = []
    for i in range(n):
        td += (1,2),
    return td

给出了build_tup的二次行为:

>>> %timeit build_tup(100)
10000 loops, best of 3: 21.7 µs per loop
>>> %timeit build_tup(1000)
1000 loops, best of 3: 1.7 ms per loop
>>> %timeit build_tup(10000)
10 loops, best of 3: 165 ms per loop

add_to_list的有效线性行为:

>>> %timeit add_to_list(100)
100000 loops, best of 3: 3.64 µs per loop
>>> %timeit add_to_list(1000)
10000 loops, best of 3: 35 µs per loop
>>> %timeit add_to_list(10000)
The slowest run took 4.96 times longer than the fastest. This could mean that an intermediate result is being cached 
1000 loops, best of 3: 348 µs per loop