我正在为色盲人员开发一个应用程序,使他们能够顺利上网。我有一组颜色,比方说A,它由色盲人员看到的所有颜色组成。集合A使用涉及数百万种颜色的大计算来计算。集合A与我的应用程序中的输入无关,即集合A对我来说就像一个“常量”(就像数学中的'pi')。现在我想存储集合A,这样每当我运行我的应用程序时,它都可以在没有任何额外的计算成本的情况下使用,即每次运行我的应用程序时都不必计算A.
我的尝试: 我认为这可以通过构建一个具有一个常量的类来完成,但是可以在不创建任何常量的特殊类的情况下完成吗?
我正在使用Python!
答案 0 :(得分:3)
答案 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