@nic777

Python, почему так медленно?

Был у меня небольшой код на php, котoрый перелопачивал приличный объем данных за пару минут с хорошей загрузкой процессора. Я переписал код на третий питон, практически строка в строку, код получился чуть компактнее, но шуршит уже полчаса и конца работе не видать (выдача выглядит правильно). Загрузка процессора не выше 5%. Он всегда такой медленный?

import struct
import io
import math

def outfile(name, seq):
    with open('ind/'+name, 'ab') as sif:
        rex = struct.pack('L', seq)
        sif.write(rex)
        sif.close()

with open("highway-line.shp", "rb") as shpf:
    hdr = shpf.read(100)
    #shpf.close

    vav = struct.unpack('<9L8d', hdr)

    x = 1
    while True:
        rh = shpf.read(8)
        if not rh:
            break
        hh = struct.unpack('>2L', rh)
        rec = shpf.read(hh[1]*2)

        r = struct.unpack('<L4d', rec[0:36]);
        sqname = '%03d%02d.bin' % (r[1],r[2])
        if (math.trunc(r[1]) != math.trunc(r[3]) or math.trunc(r[2]) != math.trunc(r[4])):
            sqname2 = '%02d%03d.bin' % (r[3],r[4])
            outfile(sqname2, x)

        outfile(sqname, x)	#print(sqname)
        x+=1

    print('Job done!');
  • Вопрос задан
  • 436 просмотров
Решения вопроса 1
@deliro
1. Читай весь файл "highway-line.shp" в память. Или хотя бы большими кусками (скажем, по 50+мб), если он не помещается в ОЗУ. А не вот это вот по 8 байтов. Если у тебя там HDD, он, наверное, с ума сходит. Чтобы сохранить код — заверни весь считанный файл в BytesIO. Хотя можно и переписать, чтобы работало просто с bytes.

2. Функция outfile просто пипец какая неоптимальная. Открывать файл, чтобы дописать записать туда 4 байта? Отличная идея! (нет)
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@metajiji
with open а внутри ещё и close. Не надо так, менеджер контекста для того и придумали, чтобы руками не закрывать за собой файлы:)
Вместо опасного while true, сделайте безопасный for. И байты внесите в память, если объемы файлов позволяют.
Ответ написан
Комментировать
Kurku
@Kurku
Погромист
Существует множество интерпретаторов для Python. Рекомендую PyPy. Из-за JIT компиляции он как правило быстрее всех других.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы