logging
提供了一个很好的框架来收集有关状态,调试信息的信息...但是,我经常需要记录一些中间结果,而这些结果通常是对象(一种常见的方法是腌他们)。如果有任何框架可以处理评分过程,即处理文件名,存储哪个文件夹和不同的商店级别(如日志级别)?
答案 0 :(得分:2)
import pickle,os
class MyPickler:
file = os.path.expanduser("~/.data.pickle")
my_data = {}
@classmethod
def update(cls,key,obj,debugLevel=0):
cls.data[key] = {"data":obj,"level":debugLevel}
@classmethod
def save(cls,debugLevel=10):
pickle.dump(
dict([(k,v) for k,v in my_data.items() if v["level"] <= debugLevel]),
open(cls.file,"wb")
)
@classmethod
def load(cls,debugLevel=11):
cls.my_data = dict([(k,v) for k,v in pickle.load(open(cls.file,"rb")).items()
if v["level"] <= debugLevel])
MyPickler.update("some_key",some_object,5)
MyPickler.save()
作为旁边 json.dump
比泡菜快得多......
答案 1 :(得分:1)
我一直使用shove作为选择工具来缓存中间结果以提高计算速度。
最简单的用例是:
>>> from shove import Shove
>>> store = Shove()
之后,您将商店用作普通字典。您可以配置shove以缓存RAM中的数据并将其存储为任何数据存储区。
答案 2 :(得分:0)
与shove
类似,还有joblib
和klepto
。
Joblib
在内存或文件(使用memmap)中提供缓存,并使用装饰器接口(而不是dict)。 Klepto
同时提供了dict风格的界面
一个装饰器界面,并有几个后端用于缓存和存档。后端不像shove
那么广泛,但klepto
在存储结果方面有很大的灵活性......它可以使用pickle,json,哈希,其他一些编码等。{ {1}}也会利用Klepto
,因此它几乎可以腌制任何东西。
以下dill
使用散列算法将结果保存到内存中:
klepto
from klepto import lru_cache as memoize
from klepto.keymaps import hashmap
hasher = hashmap(algorithm='md5')
class Adder(object):
"""A simple class with a memoized method"""
@memoize(keymap=hasher, ignore=('self','**'))
def __call__(self, x, *args, **kwds):
debug = kwds.get('debug', False)
if debug:
print ('debug:', x, args, kwds)
return sum((x,)+args)
add = __call__
add = Adder()
assert add(2,0) == 2
assert add(2,0,z=4) == 2 # cached (ignore z)
assert add(2,0,debug=False) == 2 # cached (ignore debug)
assert add(1,2,debug=False) == 3
assert add(1,2,debug=True) == 3 # cached (ignore debug)
assert add(4) == 4
assert add(x=4) == 4 # cached
plus = Adder()
assert plus(4,debug=True) == 4 # cached (ignore debug)
assert plus(2,0,3) == 5
assert plus(2,0,4) == 6
info = add.__call__.info()
assert info.hit == 5
assert info.miss == 5
cache = add.__call__.__cache__()
assert sorted(cache.values()) == [2,3,4,5,6]
还可以将结果存储在数据库后端中,并允许用户选择
用于何时将内存缓存转储并加载到数据库的算法。
这是Klepto
的dict风格界面:
klepto
同时使用from klepto.archives import sqltable_archive as sql_archive
#d = sql_archive('postgresql://user:pass@localhost/defaultdb', cached=False)
#d = sql_archive('mysql://user:pass@localhost/defaultdb', cached=False)
d = sql_archive(cached=False)
d['a'] = 1
d['b'] = '1'
assert d['a'] == 1
assert d['b'] == '1'
d['c'] = min
squared = lambda x:x**2
d['d'] = squared
assert d['c'] == min
assert d['d'](2) == squared(2)
和klepto
,您还可以选择将结果存储在磁盘上,并自动创建文件名或其他方式。
Joblib在这里:https://pythonhosted.org/joblib/
Klepto在这里:https://github.com/uqfoundation/klepto