带dict的Cython与python相同

2024-04-25 08:53:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经尝试了一些可用的解决方案,但无法得到任何加速与以下Cython代码。你知道吗

cython代码所用的时间与其python等效代码相同。你知道吗

计算_总和.pyx

# key_id: it is a string
# values_dict: it is a dictionary with key as str and values as numpy.ndarray consisting of floats
# e.g.: print(values_dict['abc']) will give out numpy.ndarray([0.01, 1.01, 2.05]). values_dict has many such entries.

cpdef dict calculate_sum(str key_id, dict values_dict):
     cdef dict result_dict = {}
     cdef str check_id

     for check_id, values in values_dict.items():
           if check_id != key_id:
                result_dict[check_id] = sum(values)

     return result_dict

你知道吗设置.py

from distutils.core import setup
from Cython.Build import cythonize

setup(ext_modules = cythonize('calculate_sum.pyx'))

你知道吗主.py

import calculate_sum

# ...
# piece of code which computes values_dict
# ...

key_id = 'abc'
sum_value = calculate_sum.calculate_sum(key_id, values_dict)

任何建议/帮助都将不胜感激。你知道吗


Tags: key代码importidischeckitresult
1条回答
网友
1楼 · 发布于 2024-04-25 08:53:59

总的来说,我不认为Cython对这段代码有帮助:它主要是操纵Python对象,而从中得到的加速往往很小。一些建议:

  • 对于numpy数组x.sum()sum(x)快得多(对于我的PC上的快速测试用例,大约快60倍)。如果您知道值将是Numpy数组,那么直接执行此操作。你知道吗
  • 代码可以重写以使用字典理解。这可能会提高一点速度(主要是因为它可以预先分配正确的大小)。你知道吗
  • 在循环中省略if语句,并计算每个键的和(然后删除key_id)可能是值得的。这一次。你知道吗

合并:

def calculate_sum(key_id, values_dict):
    result_dict = { key: values.sum() for key, values in values_dict.items() }
    del result_dict[key_id]
    return result_dict

请注意,我把所有的赛顿的东西都扔了,因为我觉得这是毫无意义的。我对这方面的基准测试不太感兴趣,但我怀疑对sum的更改将起主要作用。你知道吗


另一种方法是使用Pandas(这里的代码未经测试……)。假设您已经用values = pd.DataFrame.from_dict(values_dict)创建了一个values数据帧,那么:

def calculate_sum(key_id, values):
    return values.sum(axis=1).drop(key_id)

在所有长度相同的Numpy数组中,这是最有效的(尽管我不认为这是绝对的要求)。您的目标是普遍使用熊猫,而不是频繁地在dict之间转换。再说一次,Cython在这里帮不上忙。你知道吗

相关问题 更多 >