2013-05-18 2 views
3

Работая над оптимизацией одного веб-сайта, я обнаружил, что окончательный травление QuerySets становится узким местом в кэшировании, и каким бы умным ни был ваш код, раскладывание относительно больших QS за 1 -2secs убьет все усилия.
Кто-нибудь сталкивался с этим?Django caching - Pickle is slow

ответ

3

Если вы в настоящее время используете рассол, могу ли я рекомендовать cPickle, который предположительно должен быть в 1000 раз быстрее.

+0

Печаль в том, что я уже использую его :) –

+0

В этом случае, вы могли бы рассмотреть [Маршалл] (http://docs.python.org/2/library/marshal.html), как это много быстрее, но, как говорят документы, не защищен от ошибочных или вредоносных данных. – Tadgh

+0

@ GillBates: Если вы используете cPickle и все еще наблюдаете за этими 1-2-секундными безликими, кажется, что эти запросы должны быть довольно огромными. Насколько они большие? Вам действительно нужно кэшировать все эти данные? – liori

0

ultrajson на помощь!

In [1]: from string import letters 

In [3]: import ujson 

In [5]: import cPickle as pickle 

In [7]: import random 

In [8]: def random_string(n=10): return ''.join([random.choice(letters) for _ in xrange(n)]) 

In [9]: DATA = {random_string(): list(range(1000)) for _ in xrange(1000)} 

In [12]: %timeit -r 3 -n 100 ujson.dumps(DATA) 
100 loops, best of 3: 89.2 

In [13]: %timeit -r 3 -n 100 pickle.dumps(DATA) 
100 loops, best of 3: 285 ms per loop