Найти - Пользователи
Полная версия: Ускорить функцию
Начало » Python для новичков » Ускорить функцию
1 2 3
asilyator
reclosedev
А что происходит в decrypt? Есть возможность скинуть код?
В decrypt происходит расшифровка алгоритмом, который есть в библиотеке, происходит вполне шустро (0,25 секунд в том же тесте).

fata1ex, и как быть с бинарниками? На все юнипсы бинарников не наберешься, а под виндой нет компилятора. А питон везде работает.
reclosedev
Вот еще более быстрый вариант с array:
import array
def reverse_with_array(data):
    a = array.array("L", data)
    a.byteswap()
    return a.tostring()
fata1ex
reclosedev, а вот это и правда быстро :) Но, насколько я понял, недостаточно.
asilyator
reclosedev, ну ты демон!

from timeit import Timer
import os, array
data = os.urandom(1024*1024)
b2 = bytearray(data)
def rev():
    assert len(data) % 4 == 0, "Data length must be multiple of 4 but is %s" % len(data)
    l = []
    i = iter(data)
    for x in range(len(data) // 4):
        l1 = [i.next(), i.next(), i.next(), i.next()]
        l1.reverse() 
        l += l1
    return "".join(l)
def rev_fast():
    b = b2
    #assert len(b) % 4 == 0, "Data length must be multiple of 4 but is %s" % len(data)
    #b = bytearray(data)
    for x in xrange(0, len(data), 4):
        b[0+x], b[1+x], b[2+x], b[3+x] = b[3+x], b[2+x], b[1+x], b[0+x]
    return b
def reverse_with_array():
    a = array.array("L", data)
    a.byteswap()
    return a.tostring()
print "1:", Timer(rev).timeit(10)
print "2:", Timer(rev_fast).timeit(10)
print "3:", Timer(reverse_with_array).timeit(10)
Результаты:
1: 6.54667590434
2: 3.62785130512
3: 0.0526457971614

Как это работает так быстро?
Вроде бы даже загрузка проца < 100%, т.е. узкое место не в нем.

А почему пустые строки в коде пропадают?
asilyator
Кроме модуля на си, мне приходит в голову еще:
- Cython. Что о нем думаете?
- Написание отдельной проги и вызов ее через exec, обмен будет через stdin/stdout. Виднузятникам в таком случае даем экзешник, линупсята сами сконпелируют.
reclosedev
fata1ex
а вот это и правда быстро Но, насколько я понял, недостаточно.
По тестам c
MB = 200
DATA = "12345678" * ((MB*1024*1024)/(4*2))
получается за 0,577 сек. Думаю, теперь будет в диск упираться.

А тут оверхед из-за перегона в array и обратно в строку. Если производительность критична и можно бы было поменять decrypt, возможно получилось бы еще что-то выжать.
asilyator
reclosedev
Думаю, теперь будет в диск упираться.
Уже упирается (см выше), но сишный вариант грузит проц меньше. Но такое, по крайней мере, уже можно распространять.

Что значит поменять decrypt? Он из библиотеки Crypto, ты хочешь ее ускорить? :)

Сишный вариант, думаю, быстрее, из-за того, что там переворот происходит на месте, без выделения и копирования.

Данные берутся из файла и пишутся в файл, можно тут соптимизировать, например, читать сразу в массив?
reclosedev
asilyator
Что значит поменять decrypt? Он из библиотеки Crypto, ты хочешь ее ускорить?
А, это которая PyCrypto? Да, затея не очень . Думал там можно как-то array передавать, но похоже она только строко-подобные принимает.

asilyator
Данные берутся из файла и пишутся в файл, можно тут соптимизировать, например, читать сразу в массив?
Наверное, возможность такая есть, нужно пробовать.
import os
import array
 
def load_byteswapped_data(file, type_code="L"):
    a = array.array(type_code)
    file_size = os.fstat(file.fileno()).st_size
    a.fromfile(file, file_size/a.itemsize)
    a.byteswap()
    return a.tostring()
 
def save_byteswapped_data(file, data, type_code="L"):
    a = array.array(type_code, data)
    a.byteswap()
    a.tofile(file)
  
with open('data.dat', 'rb') as f:
    bs_data = load_byteswapped_data(f)
# do something with byteswapped data
# ...
with open('data1.dat', 'wb') as f:
    save_byteswapped_data(f, bs_data)
upd: byteswap пропустил
asilyator
Можно и так, только там файл большой, надо читать его по кускам и не сначала.
DeFoR
def m1(data):
    return data[3::-1]+data[:3:-1]

Этот вариант вроде как еще быстрее
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