Уведомления

Группа в Telegram: @pythonsu

#1 Май 28, 2012 23:14:37

asilyator
От:
Зарегистрирован: 2010-10-24
Сообщения: 276
Репутация: +  -2  -
Профиль   Отправить e-mail  

Ускорить функцию

reclosedev
А что происходит в decrypt? Есть возможность скинуть код?
В decrypt происходит расшифровка алгоритмом, который есть в библиотеке, происходит вполне шустро (0,25 секунд в том же тесте).

fata1ex, и как быть с бинарниками? На все юнипсы бинарников не наберешься, а под виндой нет компилятора. А питон везде работает.



Офлайн

#2 Май 28, 2012 23:15:04

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Ускорить функцию

Вот еще более быстрый вариант с array:

import array
def reverse_with_array(data):
    a = array.array("L", data)
    a.byteswap()
    return a.tostring()

Отредактировано reclosedev (Май 28, 2012 23:15:43)

Офлайн

#3 Май 28, 2012 23:22:21

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Ускорить функцию

reclosedev, а вот это и правда быстро :) Но, насколько я понял, недостаточно.



Офлайн

#4 Май 28, 2012 23:26:17

asilyator
От:
Зарегистрирован: 2010-10-24
Сообщения: 276
Репутация: +  -2  -
Профиль   Отправить e-mail  

Ускорить функцию

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 (Май 28, 2012 23:28:17)

Офлайн

#5 Май 28, 2012 23:32:10

asilyator
От:
Зарегистрирован: 2010-10-24
Сообщения: 276
Репутация: +  -2  -
Профиль   Отправить e-mail  

Ускорить функцию

Кроме модуля на си, мне приходит в голову еще:
- Cython. Что о нем думаете?
- Написание отдельной проги и вызов ее через exec, обмен будет через stdin/stdout. Виднузятникам в таком случае даем экзешник, линупсята сами сконпелируют.



Офлайн

#6 Май 28, 2012 23:36:30

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Ускорить функцию

fata1ex
а вот это и правда быстро Но, насколько я понял, недостаточно.
По тестам c
MB = 200
DATA = "12345678" * ((MB*1024*1024)/(4*2))
получается за 0,577 сек. Думаю, теперь будет в диск упираться.

А тут оверхед из-за перегона в array и обратно в строку. Если производительность критична и можно бы было поменять decrypt, возможно получилось бы еще что-то выжать.

Офлайн

#7 Май 28, 2012 23:41:45

asilyator
От:
Зарегистрирован: 2010-10-24
Сообщения: 276
Репутация: +  -2  -
Профиль   Отправить e-mail  

Ускорить функцию

reclosedev
Думаю, теперь будет в диск упираться.
Уже упирается (см выше), но сишный вариант грузит проц меньше. Но такое, по крайней мере, уже можно распространять.

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

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

Данные берутся из файла и пишутся в файл, можно тут соптимизировать, например, читать сразу в массив?



Отредактировано asilyator (Май 28, 2012 23:43:39)

Офлайн

#8 Май 29, 2012 17:51:51

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Ускорить функцию

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 пропустил

Отредактировано reclosedev (Май 29, 2012 22:21:01)

Офлайн

#9 Май 31, 2012 02:37:00

asilyator
От:
Зарегистрирован: 2010-10-24
Сообщения: 276
Репутация: +  -2  -
Профиль   Отправить e-mail  

Ускорить функцию

Можно и так, только там файл большой, надо читать его по кускам и не сначала.



Офлайн

#10 Май 31, 2012 06:48:30

DeFoR
От:
Зарегистрирован: 2008-02-21
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Ускорить функцию

def m1(data):
    return data[3::-1]+data[:3:-1]

Этот вариант вроде как еще быстрее



Отредактировано DeFoR (Май 31, 2012 06:50:42)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version