过去几年我一直断断续续地修改 Python (v3)。作为学习练习,我几周前决定重构我编写的一组 bash 脚本。我还认为该语言的某些功能将极大地加快处理速度。这些 bash 脚本通常运行 5 或 6 天来处理巨大的数据文件。 Python版本还显着提高了代码的可读性和可维护性。
首先,我将算法作为一个文件中的程序运行。该算法使用多个大型查找表,以列表和字典的形式实现。现在我想将其分解 - 核心逻辑进入一个文件,第二个文件包含一个包含查找表及其关联函数的类。数据表大约需要 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,因此面向对象技术还不是我的专长!
最佳答案
就我个人而言,我不会将大型列表与该类存储在同一模块中。将它们以某种格式保存在外部 python 模块中,管理它们并在需要时加载它们怎么样?
根据大小和需求,您可以使用 pickle
、pandas
、csv
或直接使用 SQL/NoSQL 数据库。
关于使用大型查找表的 Python 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55727402/