1

这更像是一个概念问题,而不是特定的代码问题。我们正在考虑优化 Python 代码中的一些较低级别的“核心”类。当前有一个类,它本质上存储了一个特征字典,以及每个特征的排序列表。需要注意的是,特征代表的可能是任何数据类型。

例子:

blah = BasicClass()
print blah.data
>> {'a': [(1, 'foo'), (2, 'bar'), (10, 'baz')],
    'b': [(100, -133231), (236, -99594)],
    'c': [(27, [1,2]), (35, [1,2,3,4])]}

此类主要是实用函数,用于在特定条件下查找数据字段中的值。

方法如:

get_first_value_after(feat, val) - 给定一个特征和一些数字,找到 data[feat] 中索引 > val 的第一个条目。

get_values_in_range(feat, start_val, end_val) - 给定一个范围,找到索引在 start_val 和 end_val 之间的 data[feat] 的所有部分。

等等等等。

我正在考虑优化这个类以尽可能提高性能,因为它在我们的很多堆栈中被调用。我一直在考虑合并 C,因为理论上这会带来一些收益,但似乎有很多方法可以扩展到 C,我不确定该走哪条路。

在我的头顶上:

  1. Ctypes 函数 - 在 C 中创建函数而不引用 python 头文件。一切都将使用本机 c,并通过 ctypes.CDLL 调用使用。期望 python 在传入之前进行 ctype 转换。

  2. C 函数模块 - 创建一个使用 pythons C API 并正确返回 PyObjects 的辅助函数模块。然后在我上面的课程中,我只是制作传递给 c 模块函数的方法

    def get_first_val_after(self, feat, val): return get_first_val_after_c(self.data[feat], val)

  3. 用 C 重写整个类——这将允许我们的底层数据结构是原生的 c,并且函数可能会更快。

我对 1 和 2 有一点经验,但我以前从未做过 3,我希望有人能够让我深入了解哪些可能会产生最佳结果。

先感谢您。

编辑:如下所述,我们目前对整个文件进行cythonize。我正在寻找测试是否扩展到 C 本身会产生更好的结果。

4

0 回答 0