PHPからPython+Djangoに切り替えて、PHPの「配列キャッシュ」に相当するものを探しています。
非常にまれにしか変更されないが非常に頻繁にアクセスされる「カテゴリ」のようなDBからの小さなデータセットの場合、配列キャッシュを使用していました。
http://www.mysqlperformanceblog.com/2006/08/09/cache-performance-comparison/
その概念は、カテゴリのツリーを使用してPHPソースを生成することであり、オペコードをオンにすると、アプリケーションソースにデータを埋め込むように機能していました。これは想像できる最速のキャッシュであり、大きな負荷に非常に役立ちました。
Djangoマニュアル(https://docs.djangoproject.com/en/1.4/topics/cache/)には次のように記載されています。
Djangoで利用できるキャッシュの中で群を抜いて最も速く、最も効率的なタイプのMemcached。
したがって、質問は次のとおりです。
- Pythonの辞書/リストを使用して.pyファイルを生成することは意味がありますか?
- これはMemcachedよりも高速ですか?そうでない場合はなぜですか?
- これの既知の実装はありますか?
- PythonにはPHPのvar_export()関数のようなものがありますか?
編集:
回答で指摘されているように、repr()を使用できます。これは簡単にベンチマークできるため、簡単なベンチマークを作成しました。
https://github.com/fsw/pythonCachesBenchmark
私のローカルマシンでのこれの出力は次のとおりです。
FIRST RUN
get_categories_from_db
6.57282209396
get_categories_from_memcached
(SET CACHE IN 0.000940)
4.88948512077
get_categories_from_pickledfile
(SET CACHE IN 0.000917)
2.87856888771
get_categories_from_pythonsrc
(SET CACHE IN 0.000489)
0.0930788516998
SECOND RUN
get_categories_from_db
6.63035202026
get_categories_from_memcached
4.60877108574
get_categories_from_pickledfile
2.87137699127
get_categories_from_pythonsrc
0.0903170108795
get_categories_from_pythonsrcは、私が話していたPHPのarraycacheの単純な実装です。
def get_categories_from_pythonsrc():
if not os.path.exists('catcache.py'):
start = time.time()
f = open( 'catcache.py', 'wb' )
categories = get_categories_from_db()
f.write('x = ' + repr(categories))
f.close()
print '(SET CACHE IN %f)' % (time.time() - start)
import catcache
return catcache.x
これは私の単純なpickledfileキャッシュの実装です。
def get_categories_from_pickledfile():
path = 'catcache.p'
if not os.path.exists(path):
start = time.time()
pickle.dump( get_categories_from_db(), open( path, 'wb' ) )
print '(SET CACHE IN %f)' % (time.time() - start)
return pickle.load(open( path, 'rb' ));
完全なソース:
https://github.com/fsw/pythonCachesBenchmark/blob/master/test.py
後で「Djangoの低レベルキャッシュAPI」をこのベンチマークに追加して、それらが何であるかを確認します。
だから私の直感が示唆したように、Python .pyファイルに辞書をキャッシュするのが私が得ることができる最速の方法です(cPickle +ファイルよりも30倍以上速い)
言ったように、私はPythonを初めて使用するので、おそらくここで何かが足りませんか?
そうでない場合:なぜこのソリューションは広く使用されていないのですか?