假设我有一个运行 SQL 查询并返回数据帧的函数:
import pandas.io.sql as psql
import sqlalchemy
query_string = "select a from table;"
def run_my_query(my_query):
# username, host, port and database are hard-coded here
engine = sqlalchemy.create_engine('postgresql://{username}@{host}:{port}/{database}'.format(username=username, host=host, port=port, database=database))
df = psql.read_sql(my_query, engine)
return df
# Run the query (this is what I want to memoize)
df = run_my_query(my_query)
我想:
- 能够使用每个值一个缓存条目来记住上面的查询
query_string
(即每个查询)
- 能够强制一个缓存重置按需(例如基于某些标志),例如这样,如果我认为数据库已更改,我可以更新缓存。
我怎样才能做到这一点joblib https://pythonhosted.org/joblib/, jug https://github.com/luispedro/jug?
是的,你可以这样做joblib https://pythonhosted.org/joblib(这个例子基本上是自我粘贴):
>>> from tempfile import mkdtemp
>>> cachedir = mkdtemp()
>>> from joblib import Memory
>>> memory = Memory(cachedir=cachedir, verbose=0)
>>> @memory.cache
... def run_my_query(my_query)
... ...
... return df
您可以使用清除缓存memory.clear()
.
请注意,您还可以使用lru_cache
甚至用一个简单的字典“手动”:
def run_my_query(my_query, cache={})
if my_query in cache:
return cache[my_query]
...
cache[my_query] = df
return df
You could清除缓存run_my_query.func_defaults[0].clear()
(虽然不确定我是否会推荐这个,只是认为这是一个有趣的例子)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)