缓存一个常量值

时间:2013-02-12 04:45:11

标签: python

我正在为色盲人员开发一个应用程序,使他们能够顺利上网。我有一组颜色,比方说A,它由色盲人员看到的所有颜色组成。集合A使用涉及数百万种颜色的大计算来计算。集合A与我的应用程序中的输入无关,即集合A对我来说就像一个“常量”(就像数学中的'pi')。现在我想存储集合A,这样每当我运行我的应用程序时,它都可以在没有任何额外的计算成本的情况下使用,即每次运行我的应用程序时都不必计算A.

我的尝试: 我认为这可以通过构建一个具有一个常量的类来完成,但是可以在不创建任何常量的特殊类的情况下完成吗?

我正在使用Python!

2 个答案:

答案 0 :(得分:3)

不需要上课。您希望将计算值存储在磁盘上并在启动时重新加载它们:为此,您需要查看shelvepickle库。

答案 1 :(得分:2)

是的,你当然可以用Python

来做到这一点

如果您的常量只是一个数字 - 比如说,您刚刚发现tau - 那么您只需在模块中声明它,然后在所有其他源文件中导入该模块:

constants.py:

# Define my new super-useful number
TAU = 6.28318530718

其他地方:

from constants import TAU # Look, no calculations!

扩展一下,如果你有一个更复杂的结构,比如字典,花了你很长时间来计算,那么你可以在你的模块中声明:

constants.py:

# Verified results of the national survey
PEPSI_CHALLENGE = {
    'Pepsi': 0.57,
    'Coke': 0.43,
}

你可以为越来越复杂的数据做到这一点。最终的问题是,只是编写常量模块越来越难,数据越复杂,如果偶尔重新计算要缓存的值,则更新起来会特别困难。在这种情况下,您希望查看pickling数据,可能是计算它的python脚本的最后一步,然后将该数据加载到您导入的模块中。

为此,请导入pickle,并将单个对象转储到磁盘文件中:

recalculate.py:

# Here is the script that computes a small value from the hugely complicated domain:
import random
from itertools import groupby
import pickle

# Collect all of the random numbers
random_numbers = [random.randint(0,10) for r in xrange(1000000)]

# TODO: Check this -- this should definitely be 7
most_popular = max(groupby(sorted(random_numbers)),
                           key=lambda(x, v):(len(list(v)),-L.index(x)))[0]

# Now save the most common random number to disk, using pickle
# Almost any object is picklable like this, but check the docs for the exact details
pickle.dump(most_popular, open('data_cache','w'))

现在,在常量文件中,您只需从磁盘上的文件中读取pickle数据,并在不重新计算的情况下使其可用:

constants.py:

import pickle

most_popular = pickle.load(open('data_cache'))

其他地方:

from constants import most_popular