Сериализация списка Python - самый быстрый метод

Начиная с Docker 3.x, ошибка BuildError содержит новую переменную build_log, которая является генератором вывода:

try:
    return client.images.build(...)
except BuildError as e:
    print("Hey something went wrong with image build!")
    for line in e.build_log:
        if 'stream' in line:
            logger.error(line['stream'].strip())
    raise
11
задан Eli Bendersky 17 February 2009 в 17:24
поделиться

6 ответов

Я предположил бы, что cPickle будет самым быстрым при реальной необходимости в вещи в списке.

Если можно использовать массив, который является встроенным типом последовательности, я синхронизировал это в четверть секунды для 1 миллиона целых чисел:

from array import array
from datetime import datetime

def WriteInts(theArray,filename):
    f = file(filename,"wb")
    theArray.tofile(f)
    f.close()

def ReadInts(filename):
    d = datetime.utcnow()
    theArray = array('i')
    f = file(filename,"rb")
    try:
        theArray.fromfile(f,1000000000)
    except EOFError:
        pass
    print "Read %d ints in %s" % (len(theArray),datetime.utcnow() - d)
    return theArray

if __name__ == "__main__":
    a = array('i')
    a.extend(range(0,1000000))
    filename = "a_million_ints.dat"
    WriteInts(a,filename)
    r = ReadInts(filename)
    print "The 5th element is %d" % (r[4])
7
ответ дан 3 December 2019 в 07:14
поделиться

Для сравнительного тестирования посмотрите timeit модуль в библиотеке стандарта Python. Для наблюдения, что является самым быстрым путем реализуйте все способы, которыми можно думать и измерить их с timeit.

Случайная мысль: в зависимости от того, что Вы делаете точно, можно найти это самым быстрым для хранения "наборов целых чисел" в стиле, используемом в .newsrc файлах:

1, 3-1024, 11000-1200000

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

3
ответ дан 3 December 2019 в 07:14
поделиться

Для помощи Вам с синхронизацией Библиотека Python обеспечивает timeit модуль:

Этот модуль обеспечивает простой путь ко времени маленькие биты кода Python. Это имеет обе командных строки, а также вызываемые интерфейсы. Это избегает многих общих прерываний для измерения времени выполнения.

Пример (из руководства), который сравнивает стоимость использования hasattr() по сравнению с. try/except протестировать на пропавших без вести и представить атрибуты объектов:

% timeit.py 'try:' '  str.__nonzero__' 'except AttributeError:' '  pass'
100000 loops, best of 3: 15.7 usec per loop
% timeit.py 'if hasattr(str, "__nonzero__"): pass'
100000 loops, best of 3: 4.26 usec per loop
% timeit.py 'try:' '  int.__nonzero__' 'except AttributeError:' '  pass'
1000000 loops, best of 3: 1.43 usec per loop
% timeit.py 'if hasattr(int, "__nonzero__"): pass'
100000 loops, best of 3: 2.23 usec per loop
2
ответ дан 3 December 2019 в 07:14
поделиться

Необходимо ли всегда загружать целый файл? В противном случае upack_from () мог бы быть лучшим решением. Предположим, что у Вас есть 1 000 000 целых чисел, но требуется загрузить просто тех от 50 000 до 50 099, Вы сделаете:

import struct
intSize = struct.calcsize('i') #this value would be constant for a given arch
intFile = open('/your/file.of.integers')
intTuple5K100 = struct.unpack_from('i'*100,intFile,50000*intSize)
2
ответ дан 3 December 2019 в 07:14
поделиться

"как можно сравнить таких вещей надежно?"

Я не получаю вопрос.

Вы пишете набор небольших функций, чтобы создать и сохранить Ваш список в различных формах.

Вы пишете набор небольших функций для загрузки списков в их различных формах.

Вы пишете немного таймерной функции, чтобы получить время начала, выполнить процедуру загрузки несколько дюжин раз (для получения твердого среднего числа, это достаточно длинно, что шум планирования ОС не доминирует измерениями).

Вы суммируете свои данные в небольшом отчете.

Что ненадежно об этом?

Вот некоторые несвязанные вопросы, который показывает, как измерить и сравнить производительность.

Преобразовать список ints к одному числу?

Конкатенация строк по сравнению со строковой заменой в Python

2
ответ дан 3 December 2019 в 07:14
поделиться

cPickle будет самым быстрым, так как он сохраняется в двоичном файле, и никакой реальный код Python не должен быть проанализирован.

Другие advantates - то, что это более безопасно (так как это не выполняет команды), и у Вас нет проблем с установкой $PYTHONPATH правильно.

1
ответ дан 3 December 2019 в 07:14
поделиться
Другие вопросы по тегам:

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