使用大型查找表的 Python 类

标签 python class module constants lookup-tables

过去几年我一直断断续续地修改 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 模块中,管理它们并在需要时加载它们怎么样?

根据大小和需求,您可以使用 picklepandascsv 或直接使用 SQL/NoSQL 数据库。

关于使用大型查找表的 Python 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55727402/

相关文章:

python - boto s3 - 使用数组写入一个 csv 文件

python - 如何在不实例化的情况下复制类属性

来自远程目录的 Java Class.forName()

linux - 编辑已编译的内核模块以提高兼容性

javascript - React.Component 和 Component 有什么区别?

python - 如何动态导入模块?

python - 以 postgres 用户身份连接到 PostgreSQL 时出现连接错误?

python - Sympy 交叉和点积无需评估

python - 如何在类外使用方法对象(在类中)?

python - 尝试使用自定义类时出现 NameError