最近用python寫個東西,裡面用到了乙個zip,記憶體飆公升,甚是費解,查閱資料後發現zip在python2和3中的機制不同
class
foo(object):
def__init__
(self):
self.items = range(3)
def__getitem__
(self, i):
print('__getitem__', i)
return self.items[i]
foo1 = foo()
foo2 = foo()
print(zip(foo1, foo2))
# for s1, s2 in zip(foo1, foo2):
# print(s1, s2)
python2
# 輸出:
# 提前已經遍歷了一遍,組成新的列表了
('__getitem__', 0)
('__getitem__', 0)
('__getitem__', 1)
('__getitem__', 1)
('__getitem__', 2)
('__getitem__', 2)
('__getitem__', 3)
[(0, 0), (1, 1), (2, 2)]
python3
# 輸出:
0x7f96933f9648>
可以看到python2中是先把2個foo**全部遍歷一下組成乙個新的列表,十分耗記憶體**
而python3是返回乙個迭代器,遍歷zip(foo1, foo2)時才會去取foo1和foo2的每個元素,不費記憶體
python2與python3的區別和差異
一 核心類差異 1.python3 對 unicode 字元的原生支援。python2 中使用 ascii 碼作為預設編碼方式導致 string 有兩種型別 str 和 unicode,python3 只 支援 unicode 的 string。python2 和 python3 位元組和字元對應關...
Python2和Python3中 的區別
首先區別於 表示整除,被除數和除數均為整型時 得到的結果為整型,被除數和除數至少有乙個是浮點型時,得到的結果是浮點型。也就是說 操作python2和python3沒有區別 表示除法,在python3中,無論被除數和除數是哪種型別,得到的都是浮點型。在python2中,被除數和除數至少有乙個浮點型時,...
python2和3 的區別
python2和python3分別是python的兩個版本,python3作為乙個公升級版,許多針對早期python版本設計的程式都無法在python3.0上正常執行的。區別 python2 既可以使用帶小括號的方式,也可以使用乙個空格來分隔列印內容,比如 print hi python3 使用 p...