i = iter(lambda: stringio.read(1),'Z')
buf = ''.join(i) + 'Z'
İşte iter
bu modda kullanıldığında teşekkür ederiz: iter(callable, sentinel) -> iterator
.
''.join(...)
oldukça etkilidir. 'Z' ''.join(i) + 'Z'
eklemenin son işlemi bu kadar iyi değil. Ama Yineleyici için 'Z'
ekleyerek ele alınabilir:
from itertools import chain, repeat
stringio = StringIO.StringIO('ABCZ123')
i = iter(lambda: stringio.read(1),'Z')
i = chain(i,repeat('Z',1))
buf = ''.join(i)
Bir daha yolu yapmak için bu jeneratör kullanmaktır: Bazı verimlilik testleri yapılmış
def take_until_included(stringio):
while True:
s = stringio.read(1)
yield s
if s=='Z':
return
i = take_until_included(stringio)
buf = ''.join(i)
. anlatılan tekniklerin performansı oldukça aynıdır:
http://ideone.com/dQGe5
Çok iyi bir çözüm! Python'un ağır yükünü işlev çağrıları üzerine giderir. Tek dezavantajı, bellekte bir "datalist" nesnesini saklaman. Bu kodu işlev yerine jeneratörle yeniden yazmak mümkündür ('join 'yineleyicileri kabul eder), böylece bellekte geçici yedek nesneler olmayacaktır. – ovgolovin
Ancak jeneratör sürümü biraz daha yavaş çıkıyor: http://ideone.com/dQGe5 (Bir dizge büyükse (1 milyon sembol) - daha sonra jeneratör versiyonu biraz daha hızlıdır). – ovgolovin
Bu arada, neden '256' sembolü parçaları seçtiniz? (Neden 512' veya '1024' değil?) – ovgolovin