Найти - Пользователи
Полная версия: Скорость pickle.dumps/loads
Начало » Python для экспертов » Скорость pickle.dumps/loads
1
Lolka
Вот для себя проводил тесты pickl'а, может не совсем адекватные, а может совсем неадекватные.
Тест такой:
# -*- coding: utf-8 -*-
#!/usr/bin/python
import cPickle as pickle
#import pickle
from random import random
from timeit import Timer

def test_case1(N):
d = {}
for i in range(0, N):
d.update({i: random()})

def test_case2(N):
d = {}
for i in range(0, N):
d.update({i: random()})
d = pickle.loads(pickle.dumps(d))

N = 100
print u'словарь на %d элементов, без pickle' % N
print (Timer("test_case1(%d)" % N, "from __main__ import test_case1").timeit(20))

print u'словарь на %d элементов, pickle.dumps/pickle.loads' % N
print (Timer("test_case2(%d)" % N, "from __main__ import test_case2").timeit(20))
Результаты такие:
без pickle
словарь на 100 элементов
0.00234794616699
словарь на 1000 элементов
0.0490698814392
словарь на 100000 элементов
2.56784296036

python pickle, pickle.dumps/pickle.loads
словарь на 100 элементов,
0.0462000370026

словарь на 1000 элементов
0.449135065079

словарь на 100000 элементов
44.5989050865

cPickle
словарь на 100 элементов, pickle.dumps/pickle.loads
0.00978302955627

словарь на 1000 элементов, pickle.dumps/pickle.loads
0.0971109867096

словарь на 100000 элементов, pickle.dumps/pickle.loads
9.78903698921
ZZZ
И в правду не совсем…

# -*- coding: utf-8 -*-

import timeit

def test(obj, desc):
p = timeit.Timer("pickle.loads(pickle.dumps(obj))",
"from __main__ import obj;import pickle")
cp = timeit.Timer("pickle.loads(pickle.dumps(obj))",
"from __main__ import obj;import cPickle as pickle")

print desc
print " pickle: %8.4f" % p.timeit(10)
print " cPickle: %8.4f" % cp.timeit(10)
print


obj = {}
import itertools
for var, val in itertools.izip(xrange(10000), xrange(10000, 20000)):
obj[var] = val
test(obj, "Словарь с 10000-мя ключами и значениями...")

obj = range(10000, 20000)
test(obj, "Лист из 10000 пятизначных интегеров...")

obj = tuple(range(10000, 20000))
test(obj, "Кортеж из 10000 пятизначных интегеров...")

obj = {}
for i in xrange(1000, 2000): # при range(10000, 20000) мне не хватило памяти...
if i / 2.0 == i / 2:
obj[i] = range(3000, 4000)
else:
obj[i] = tuple(range(5000, 6000))
test(obj, "Смешанные типы...")
ZZZ
Вывод:
Словарь с 10000-мя ключами и значениями...
pickle: 1.4319
cPickle: 0.1351

Лист из 10000 пятизначных интегеров...
pickle: 0.7780
cPickle: 0.0838

Кортеж из 10000 пятизначных интегеров...
pickle: 0.6247
cPickle: 0.0561

Смешанные типы...
pickle: 68.9187
cPickle: 6.7006
MacBookPro, Intel 2.5GHz, 3GB. Python 2.5.1 сборки Apple. MacOS X Leopard, нагруженна Parallels Desktop'ом (жрёт проц!), Оперой… ну и ещё всякой херотенью и фиговертиной.
ZAN
ZZZ
MacBookPro, Intel 2.5GHz, 3GB. Python 2.5.1 сборки Apple.
ыыыы (извините за оффтоп)
ZZZ
Да, я бравый юниксоид, хренов пингвиновед, кажэешник и анимешник перелез на MacOS X Leopard. Ощущения спорные – с одной стороны красиво, удобно и логично, а с другой – чё-то здесь не так… :-)
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