StringIO
имеет следующие ноты в своем коде:Реальные файловые объекты медленнее, чем StringIO и cStringIO?
Notes:
- Using a real file is often faster (but less convenient).
- There's also a much faster implementation in C, called cStringIO, but
it's not subclassable.
«Настоящий файл часто быстрее» линия казалась очень странной для меня: как можно писать на диск бить запись в память? Я попробовал профилировать эти разные случаи и получил результаты, которые противоречат этим документам, а также ответ на вопрос this question. This other question действительно объясняет, почему cStringIO медленнее при некоторых обстоятельствах, хотя я не собираюсь здесь конкатенироваться. Тест записывает заданный объем данных в файл, затем ищет начало и считывает его обратно. В «новых» тестах каждый раз я создавал новый объект, а на «тех же» я усекаю и повторно использую один и тот же объект для каждого повторения, чтобы исключить этот источник накладных расходов. Эти накладные расходы имели значение для использования tempfiles с небольшими размерами данных, но не большими.
Код here.
Using 1000 passes with size 1.0KiB
New StringIO: 0.0026 0.0025 0.0034
Same StringIO: 0.0026 0.0023 0.0030
New cStringIO: 0.0009 0.0010 0.0008
Same cStringIO: 0.0009 0.0009 0.0009
New tempfile: 0.0679 0.0554 0.0542
Same tempfile: 0.0069 0.0064 0.0070
==============================================================
Using 1000 passes with size 100.0KiB
New StringIO: 0.0093 0.0099 0.0108
Same StringIO: 0.0109 0.0090 0.0086
New cStringIO: 0.0130 0.0139 0.0120
Same cStringIO: 0.0118 0.0115 0.0124
New tempfile: 0.1006 0.0905 0.0899
Same tempfile: 0.0573 0.0526 0.0523
==============================================================
Using 1000 passes with size 1.0MiB
New StringIO: 0.0727 0.0700 0.0717
Same StringIO: 0.0740 0.0735 0.0712
New cStringIO: 0.1484 0.1399 0.1470
Same cStringIO: 0.1493 0.1393 0.1465
New tempfile: 0.6576 0.6750 0.6821
Same tempfile: 0.5951 0.5870 0.5678
==============================================================
Using 1000 passes with size 10.0MiB
New StringIO: 1.0965 1.1129 1.1079
Same StringIO: 1.1206 1.2979 1.1932
New cStringIO: 2.2532 2.2162 2.2482
Same cStringIO: 2.2624 2.2225 2.2377
New tempfile: 6.8350 6.7924 6.8481
Same tempfile: 6.8424 7.8114 7.8404
==============================================================
StringIO
Две реализации были довольно сопоставимы, хотя cStringIO
существенно замедлилась для больших объемов данных. Но tempfile.TemporaryFile
всегда занимал в 3 раза длиннее StringIO
.
Я не верю, что вы сравниваете правильные вещи здесь. Эти ответы говорят о вашей основной файловой оболочке Python - 'file' - не' tempfile.TemporaryFile'. –
Возможно, потому что файл IO обе оптимизирован ОС и проходит через кеш-память, которая, скорее всего, будет быстрее в некоторых распространенных случаях, чем то, что делает модуль Python в фоновом режиме. – dtanders
@ Two-BitAlchemist Я бы не ожидал, что 'TemporaryFile' будет сильно отличаться от' file' для чтения и записи. И глядя на 'tempfile',' TemporaryFile' на самом деле является функцией, которая возвращает 'file's, по крайней мере, на POSIX (это то, что я использовал). Любые накладные расходы из-за различий в создании должны быть учтены в случаях «того же tempfile». –