【发布时间】:2019-04-17 12:18:57
【问题描述】:
在过去的几年里,我一直在不断地修改 Python (v3)。作为学习练习,我决定在几周前重构我编写的一系列 bash 脚本。我还认为该语言的某些功能将大大加快处理速度。这些 bash 脚本通常运行 5 或 6 天,处理巨大的数据文件。 Python版本还显着提高了代码的可读性和可维护性。
首先,我将算法作为程序放在一个文件中。该算法使用几个大型查找表,以列表和字典的形式实现。现在我想把它分解——核心逻辑进入一个文件,第二个文件包含一个包含查找表及其相关函数的类(es?)。数据表大约需要 350 行代码,函数大小也差不多。
问:构建类模块文件的首选方式是什么?
比如我一开始是这样做的,我们称之为案例1:
class Zebra:
_stripe_keys = [ ....... ]
_stripe_info = [ [.....], [.....], ... [.....] ]
_stripes = [ dict(zip( stripe_keys, info )) for info in stripe_info ]
<<< many such tables >>>
def __init__(self, name):
self.name = name
def function_one(self):
do something
def function_two(self):
do something
<<< etc... >>>
然后我意识到这可能会更好,案例 2:
_stripe_keys = [ ....... ]
_stripe_info = [ [.....], [.....], ... [.....] ]
_stripes = [ dict(zip( stripe_keys, info )) for info in stripe_info ]
<<< many such tables >>>
class Zebra:
def __init__(self, name):
self.name = name
def function_one(self):
do something
def function_two(self):
do something
<<< etc... >>>
然后我看到了另一种可能性,案例 3,但不知何故,我不得不将数据类传递给函数类:
class ZebraTables:
_stripe_keys = [ ....... ]
_stripe_info = [ [.....], [.....], ... [.....] ]
_stripes = [ dict(zip( stripe_keys, info )) for info in stripe_info ]
<<< many such tables >>>
def __init__(self, name):
self.name = name
class Zebra:
def __init__(self, name):
self.name = name
def function_one(self):
do something
def function_two(self):
do something
<<< etc... >>>
数据表基本上是不变的。如果有理由创建此类的两个实例,则数据应该共享而不是重复。源代码中的静态数据占用了几十MB的内存,加上启动时从磁盘读取的额外数据,总计约600MB)。我认为这意味着案例 2 是我想要的,但我不确定。我来自嵌入式背景,主要使用 C,所以面向对象技术还不是我的专长!
【问题讨论】:
-
如果数据是不变的,你可以把所有的东西都放在模块级别并完成它。仅在对您的代码有意义的情况下才使用一个类,您不必必须对所有事情都使用 OO。
-
一旦您在脚本中导入其中一个类,您的查找表就会被加载到内存中。因此,如果您想避免这种情况,您需要将这些表中的每一个放在不同的模块中并有选择地导入它们。
-
我同意@Martijn——此外,模块的行为类似于类的单例实例。事实上,如果你愿意,你可以手动将一个类的实例添加到
sys.modules,让它看起来是一个(已经导入的)模块。
标签: python class module constants lookup-tables