Найти - Пользователи
Полная версия: Ускорение обработки двоичного файла
Начало » Python для новичков » Ускорение обработки двоичного файла
1 2 3 4 5 6 7 8
erl
Ed
2 erl: Кстати, по поводу замены ‘\xff’ на chr(255). Вы поменяли константу на вызов. Этот вызов у вас происходит в цикле. Судя по размеру файла и размеру блока итераций много. Понятно куда я веду?
Понятно … переделаю…
Андрей Светлов
Тогда стоит завести еще block_0 и, главное, block_find
Ed
erl
Ed
Если будете менять скрипт - показывайте и его
Я же показал уже изменения.
Эти я видел. ‘будете’ - будущее время вообще то. Я имел в виду если попрофайлив чего-то поменяете, то нужно будет показать последнюю версию скрипта и последний вывод профайлера. Тогда будут и советы соответствующие действительности.
erl
Profile на вот этот скрипт:

http://pastebin.com/dgT58pwd

Ordered by: cumulative time

ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 731.984 731.984 <string>:1(<module>)
1 0.002 0.002 731.984 731.984 {execfile}
1 0.002 0.002 731.983 731.983 test2.py:2(<module>)
1 81.779 81.779 731.981 731.981 test2.py:45(main)
4766057 255.918 0.000 447.373 0.000 test2.py:10(gen_record)
4766056 57.633 0.000 174.220 0.000 {method ‘encode’ of ‘str’ objects}
4766056 68.129 0.000 116.570 0.000 hex_codec.py:13(hex_encode)
25630328 106.164 0.000 106.164 0.000 {len}
16098219 76.919 0.000 76.919 0.000 {method ‘find’ of ‘str’ objects}
4766056 28.530 0.000 28.530 0.000 {method ‘write’ of ‘file’ objects}
4766057 28.516 0.000 28.516 0.000 {method ‘read’ of ‘file’ objects}
4766056 28.297 0.000 28.297 0.000 {binascii.b2a_hex}
2 0.079 0.039 0.079 0.039 {open}
1 0.000 0.000 0.017 0.017 __init__.py:71(search_function)
1 0.016 0.016 0.017 0.017 {__import__}
1 0.001 0.001 0.001 0.001 hex_codec.py:8(<module>)
2 0.000 0.000 0.000 0.000 {built-in method now}
2 0.000 0.000 0.000 0.000 {method ‘close’ of ‘file’ objects}
1 0.000 0.000 0.000 0.000 __init__.py:49(normalize_encoding)
1 0.000 0.000 0.000 0.000 hex_codec.py:70(getregentry)
1 0.000 0.000 0.000 0.000 codecs.py:77(__new__)
3 0.000 0.000 0.000 0.000 {method ‘get’ of ‘dict’ objects}
2 0.000 0.000 0.000 0.000 {isinstance}
1 0.000 0.000 0.000 0.000 {chr}
1 0.000 0.000 0.000 0.000 {method ‘translate’ of ‘str’ objects}
1 0.000 0.000 0.000 0.000 {method ‘split’ of ‘str’ objects}
1 0.000 0.000 0.000 0.000 {method ‘replace’ of ‘str’ objects}
1 0.000 0.000 0.000 0.000 hex_codec.py:45(Codec)
1 0.000 0.000 0.000 0.000 {built-in method __new__ of type object at 0x8149180}
1 0.000 0.000 0.000 0.000 {sys.exit}
1 0.000 0.000 0.000 0.000 hex_codec.py:57(IncrementalDecoder)
1 0.000 0.000 0.000 0.000 {method ‘join’ of ‘str’ objects}
1 0.000 0.000 0.000 0.000 hex_codec.py:62(StreamWriter)
1 0.000 0.000 0.000 0.000 hex_codec.py:52(IncrementalEncoder)
1 0.000 0.000 0.000 0.000 {hasattr}
1 0.000 0.000 0.000 0.000 hex_codec.py:65(StreamReader)
1 0.000 0.000 0.000 0.000 {method ‘disable’ of ‘_lsprof.Profiler’ objects}
erl
Андрей Светлов
Тогда стоит завести еще block_0 и, главное, block_find
Андрей, а можно по подробней, для меня(т.е. для тех кто на броне :-) ), что такое block_0 и block_find ?
Андрей Светлов
Наконец-то собрался сам посмотреть более пристально.
Сгенерировал по методе Pooh файл на 2.000.000 записей, что вышло чуть больше чем 500 Мб

Скрипт из поста #64 отрабатывал на моем стареньком ноуте 50-60 секунд.
Профилирование показывает, что большая часть времени тратится на преобразование в hex при выводе обработанных данных в файл.
Убрав эту запись получим время чтения записей - немного больше 6 секунд.
erl, алгоритм работает именно 6 секунд - это достаточно для вас хорошо?
Быстрый просмотр дизассемблером функции gen_records выявил пару мелких затыков. Их устранение дало прирост почти в 10%, что примечательно само по себе как пример микрооптимизации - но большой роли не играет.
Даже если получится сократить время вдвое, с 6 до 3 секунд - это не критично с моей точки зрения, в то время как может потребовать значительных усилий.

Итак, 5.6 секунд на горячем файле - это достаточно быстро или нет?

Поправленный код:
http://pastebin.com/66QCvkML
erl
Андрей Светлов
Даже если получится сократить время вдвое, с 6 до 3 секунд - это не критично с моей точки зрения, в то время как может потребовать значительных усилий.

Итак, 5.6 секунд на горячем файле - это достаточно быстро или нет?

Поправленный код:
http://pastebin.com/66QCvkML
5.6 секунд это просто замечательно, здорово, волшебно, я бы использовал слово супер, но мне кажется оно не выражает всего что ощущаю и чувствую.
Обязательно проверю Ваш код на боевом файле и все выскажу.
Спасибо за Вашу помощь Андрей
Спасибо Всем великим помощникам, я еще напишу о результате проверки на реальном файле.
erl
Результат последнего скрипта.

Ordered by: cumulative time

ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 583.212 583.212 <string>:1(<module>)
1 0.002 0.002 583.212 583.212 {execfile}
1 0.001 0.001 583.210 583.210 test2_2.py:2(<module>)
1 82.626 82.626 583.209 583.209 test2_2.py:54(main)
4766057 174.361 0.000 297.675 0.000 test2_2.py:10(gen_record)
4766056 57.574 0.000 174.216 0.000 {method ‘encode’ of ‘str’ objects}
4766056 68.179 0.000 116.641 0.000 hex_codec.py:13(hex_encode)
16098219 75.396 0.000 75.396 0.000 {method ‘find’ of ‘str’ objects}
9532112 40.438 0.000 40.438 0.000 {len}
4766056 28.692 0.000 28.692 0.000 {method ‘write’ of ‘file’ objects}
4766056 28.296 0.000 28.296 0.000 {binascii.b2a_hex}
4766057 27.646 0.000 27.646 0.000 {method ‘read’ of ‘file’ objects}
1 0.000 0.000 0.002 0.002 __init__.py:71(search_function)
1 0.000 0.000 0.001 0.001 {__import__}
1 0.001 0.001 0.001 0.001 hex_codec.py:8(<module>)
2 0.000 0.000 0.000 0.000 {built-in method now}
2 0.000 0.000 0.000 0.000 {open}
2 0.000 0.000 0.000 0.000 {method ‘close’ of ‘file’ objects}
1 0.000 0.000 0.000 0.000 __init__.py:49(normalize_encoding)
1 0.000 0.000 0.000 0.000 hex_codec.py:70(getregentry)
1 0.000 0.000 0.000 0.000 codecs.py:77(__new__)
3 0.000 0.000 0.000 0.000 {method ‘get’ of ‘dict’ objects}
2 0.000 0.000 0.000 0.000 {isinstance}
1 0.000 0.000 0.000 0.000 {chr}
1 0.000 0.000 0.000 0.000 {method ‘split’ of ‘str’ objects}
1 0.000 0.000 0.000 0.000 {method ‘replace’ of ‘str’ objects}
1 0.000 0.000 0.000 0.000 {built-in method __new__ of type object at 0x8149180}
1 0.000 0.000 0.000 0.000 {sys.exit}
1 0.000 0.000 0.000 0.000 hex_codec.py:57(IncrementalDecoder)
1 0.000 0.000 0.000 0.000 {method ‘join’ of ‘str’ objects}
1 0.000 0.000 0.000 0.000 hex_codec.py:52(IncrementalEncoder)
1 0.000 0.000 0.000 0.000 hex_codec.py:45(Codec)
1 0.000 0.000 0.000 0.000 hex_codec.py:65(StreamReader)
1 0.000 0.000 0.000 0.000 {method ‘translate’ of ‘str’ objects}
1 0.000 0.000 0.000 0.000 hex_codec.py:62(StreamWriter)
1 0.000 0.000 0.000 0.000 {hasattr}
1 0.000 0.000 0.000 0.000 {method ‘disable’ of ‘_lsprof.Profiler’ objects}

привет Андрей, результат работы чистого скрипта на реальном файле 500 М Elapsed time: 0:02:08.970140, где собственно обещанные 5 секунд :-)
erl
Я думаю проблема в том что, как я уже писал в посте #40, между началом записи и окончание записи могут быть символы FF … если вы в своем генерированном файле вставити 5-6 символов FF между 32 и FF, а также между 34 и FF, то наверно время резко возрастет.
И еще чем бы заменить len, существует ли более “дешевая” с точки зрения производительности конструкция.
Ed
Я вечером попробую глянуть что можно сделать.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB