是否有任何Python框架收集系统的中间结果,如日志记录?

时间:2014-05-20 18:39:15

标签: python logging pickle

logging提供了一个很好的框架来收集有关状态,调试信息的信息...但是,我经常需要记录一些中间结果,而这些结果通常是对象(一种常见的方法是腌他们)。如果有任何框架可以处理评分过程,即处理文件名,存储哪个文件夹和不同的商店级别(如日志级别)?

3 个答案:

答案 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类似,还有joblibklepto

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