簡體   English   中英

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

[英]Is there a limit on tuple size in python?

我想組裝一個神經網絡訓練集。 我有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分鍾內也無法完成。

可能會發生什么? 為什么我沒有收到錯誤消息? 有沒有更好的方法來創建相同的元組?

我認為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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM