LINUX.ORG.RU

Перевод из hex в dec очень сильно грузит процессор.

 


0

1

Python 3.5.2 [GCC 5.4.0 20160609]

data = open('input.tar.gz', 'rb').read()                  #Открыть              
data_hex = data.hex()                                     #Перевести в нормальный hex вид                             
data_dec = int(data_hex, 16)                              #Перевести в dec
output = open('output.txt', 'wt').write(str(data_dec))    #Записать в файл
input.tar.gz весит 1.1 МБ. 1 ядро работает около 4 минут для выполнения кода.

Почему требуется так много выч.ресурсов? Как я понимаю, дело здесь в 3 строчке — но разве на это нужно так много ресурсов? Хотелось бы понять, почему так происходит и как можно ускорить выполнение.

UPD. «The process python3 (with pid 3609) is using approximately 11.0 MB of memory. It is using 11.0 MB privately, and a further 2.6 MB that is, or could be, shared with other programs.» — размер со временем растет.



Последнее исправление: kramh (всего исправлений: 5)

обавил в 3 строчке перевод в oct, и код стал выполняться мгновенно. Что за магия?

data = open('input.tar.gz', 'rb').read()                       #Открыть
data_hex = data.hex()                                          #Перевести в нормальный hex вид
data_oct = oct(int(data_hex, 16))                              #Перевести в oct
output = open('output.txt', 'wt').write(str(data_oct))         #Записать в файл

kramh
() автор топика

Почему требуется так много выч.ресурсов? Как я понимаю, дело здесь в 3 строчке

Нет, тут дело в str(data_dec).

Прочитать данные из файла — быстро. Перевести их в шестнадцатеричное число — быстро. Каждый байт переводится в два. Распарсить строку — быстро. Каждые два байта переводятся в один. А вот чтобы полученное большое число представить в десятичном виде, нужно сделать очень много циклов деления на 10 и взятия остатка. Питон это, похоже, делает сам, поэтому медленно.

Попробуй GMP:

from gmpy2 import mpz

data = open('/boot/vmlinuz-4.8.0-1-amd64', 'rb').read()
data_hex = data.hex()
data_dec = int(data_hex, 16)
data_dec = mpz("0x" + data_hex)
output = open('output.txt', 'wt').write(str(data_dec))

i-rinat ★★★★★
()
Ответ на: комментарий от kramh

Попробуй оба варианта выполнить вручную, используя только команды процессора, хотяб 1КиБ.

anonymous
()
Ответ на: комментарий от i-rinat

Действительно помогло, спасибо. Сейчас за ~2 секунды выполняется код.

Не знаете, будет ли ощутимый прирост производительности, если на C полностью переписать? Или это не даст особого результата, т.к. основная часть уже на C(gmpy2), и за счет перехода можно будет лишь добиться повышения производительности в других частях, которые особо не требовательны?

kramh
() автор топика
Ответ на: комментарий от kramh

не даст особого результата, т.к. основная часть уже на C(gmpy2)

Не думаю, что будет существенная прибавка.

i-rinat ★★★★★
()
Ответ на: комментарий от deadNightTiger

А sprintf разве может выводить числа порядка 1E+больше_двух_миллионов?

anonymous
()
Ответ на: комментарий от kramh

Не знаете, будет ли ощутимый прирост производительности, если на C полностью переписать? Или это не даст особого результата, т.к. основная часть уже на C(gmpy2), ...

Знаем: "... gmpy2 is a C-coded Python extension module ..." :)

anonymous
()
Ответ на: комментарий от i-rinat

Хотелось бы узнать, какие подводные камни в повседневном использовании gmpy2? Вроде он довольно хорош и может заменить многие встроенные функции.

kramh
() автор топика
Ответ на: комментарий от kramh

какие подводные камни в повседневном использовании gmpy2

Я про существование gmpy2 узнал за пять минут до отправки того сообщения с примером кода.

i-rinat ★★★★★
()
Ответ на: комментарий от kramh

Пользуем в продакшене уже херпойми сколько времени. Брат жив, зависимость сильная.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.