[英]passing a list pointer to a function rather than the list
是否可以將(移動的)指向列表開頭的指針傳遞到Python中的函數中?
我在列表的一部分上有一個遞歸函數。 列表本身不會更改,只是指向其中的“起點”的指針。 我遇到的問題是,長長的列表殺死了內存溢出的代碼。
這是代碼:
def trim(l):
print("list len= ", len(l))
if len(l)!= 1:
trim(l[1:])
else:
print("done")
上面的示例是人為設計的,我的實際代碼除了剪裁列表之外還執行其他操作,但是它還有一個移動的起始指針。 一百萬個整數列表在10G RAM計算機上耗盡了內存。
任何想法都歡迎。
如果您正在編寫一個非尾調用遞歸函數以遍歷列表,則問題很可能是堆棧溢出或與堆棧大小有關的內存不足錯誤。
我建議使用整數指針和for循環來重寫它,因為Python似乎沒有尾調用優化。
這是您可能想要做的一個猜測:
x = [0,0,0,0,0,1,2,3,4]
def trim_leading_zero(l):
the_len = len(l)
start_i = 0
for i in xrange(the_len):
if l[i] != 0:
return l[i:]
>>> trim_leading_zero(x)
[1, 2, 3, 4]
從您的代碼尚不清楚它實際上意味着什么。 如果您嘗試實際返回一個序列,則可能需要查看Generators,它們不需要在內存中保存整個序列。
您不能只傳遞索引而不是傳遞整個新列表嗎?
因此,您將調用trim(l, 0)
,然后對照列表的長度檢查索引,然后在需要時調用trim(l, 1)
。
def trim(l, idx):
print("list len = ", (len(l) - idx))
if idx < (len(x) - 1):
trim(l, idx + 1)
else:
print("done")
處理大數據時,請使用生成器,而不是常規的迭代器。
def trim(l):
print("list len= ", len(l))
pointer = 0
if len(l)!= 1:
yield l[pointer:]
pointer += 1
else:
print("done")
x = [1, 2, 3, 4, 5, 6, 7, 8, 9]
for i in trim(x):
print i
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
生成器一次生成一個項,讓您隨心所欲地做, 避免在處理之前先創建整個列表。 如果要從中獲取列表,則只需執行list(trim(x))
。
這里對yield
和generators
有很好的解釋-yield關鍵字有什么作用
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.