1

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

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

我正在使用 Python!

4

2 回答 2

3

不需要上课。您希望将计算的值存储在磁盘上并在启动时再次加载它们:为此您需要查看搁置泡菜库。

于 2013-02-12T04:48:50.790 回答
2

是的,你当然可以用 Python 做到这一点

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

常量.py:

# Define my new super-useful number
TAU = 6.28318530718

其他地方:

from constants import TAU # Look, no calculations!

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

常量.py:

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

您可以对越来越复杂的数据执行此操作。最终,问题在于编写常量模块变得越来越难,数据越复杂,如果偶尔重新计算要缓存的值,更新可能会特别困难。在这种情况下,您希望查看酸洗数据,可能是计算数据的 python 脚本的最后一步,然后将该数据加载到您导入的模块中。

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

重新计算.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'))

现在,在您的常量文件中,您可以简单地从磁盘上的文件中读取腌制数据,并使其可用而无需重新计算:

常量.py:

import pickle

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

其他地方:

from constants import most_popular
于 2013-02-12T05:13:16.063 回答