考慮下面的程序:爲什麼此腳本隨着輸入量增加而減慢每個項目的速度?
#!/usr/bin/env pypy
import json
import cStringIO
import sys
def main():
BUFSIZE = 10240
f = sys.stdin
decoder = json.JSONDecoder()
io = cStringIO.StringIO()
do_continue = True
while True:
read = f.read(BUFSIZE)
if len(read) < BUFSIZE:
do_continue = False
io.write(read)
try:
data, offset = decoder.raw_decode(io.getvalue())
print(data)
rest = io.getvalue()[offset:]
if rest.startswith('\n'):
rest = rest[1:]
decoder = json.JSONDecoder()
io = cStringIO.StringIO()
io.write(rest)
except ValueError, e:
#print(e)
#print(repr(io.getvalue()))
continue
if not do_continue:
break
if __name__ == '__main__':
main()
而這裏的測試用例:
$ yes '{}' | pv | pypy parser-test.py >/dev/null
正如你可以看到,下面的腳本減慢當你添加更多的投入到它。這也發生在cPython上。我試圖用mprof和cProfile來描述腳本,但是我沒有發現爲什麼會這樣。有人有線索嗎?
爲什麼*不*它變慢更多的投入? – jonrsharpe
我試圖讓它迭代 - 獲取一個對象,打印並丟棄它。我不希望那裏有內存泄漏。你能看到一個嗎? – d33tah
我不是在談論內存泄漏!輸入越長,處理的時間就越長,除非你的算法是'O(1)'。或者你的意思是,隨着輸入長度的增加,每個項目需要更長的時間**。 – jonrsharpe