Форум сайта python.su
Вот для себя проводил тесты 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
Офлайн
И в правду не совсем…
# -*- 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)
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, "Смешанные типы...")
Офлайн
Вывод:
Словарь с 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
Отредактировано (Ноя. 12, 2008 01:09:26)
Офлайн
ZZZыыыы (извините за оффтоп)
MacBookPro, Intel 2.5GHz, 3GB. Python 2.5.1 сборки Apple.
Офлайн
Да, я бравый юниксоид, хренов пингвиновед, кажэешник и анимешник перелез на MacOS X Leopard. Ощущения спорные – с одной стороны красиво, удобно и логично, а с другой – чё-то здесь не так… :-)
Офлайн