Python:具有内置库的更快的通用哈希函数

标签 python hash

我正在尝试仅使用基本库来实现通用哈希函数: enter image description here

我遇到了问题,因为我无法在有效时间内运行它。我知道 % 很慢,所以我尝试了以下方法:

((a * x + b) % P) % n

divmod(divmod(a * x + b, P)[1], n)[1]

subeq = pow(a * x + b, 1, P)
hash = pow(subeq, 1, self.n)

所有这些功能对于我想要做的事情来说都太慢了。有没有一种更快的方法来仅使用我不知道的基本库进行 mod 除法?

编辑 详细来说,我将运行此函数大约 200000 次(或更多),并且我需要在 4 秒内完成所有 200000 次运行。这些方法都不是那么简单(需要几分钟)

最佳答案

在纯 Python 代码中你不会做得比 ((a * x + b) % P) % m 更好; Python 解释器的开销将成为你最大的瓶颈;是的,如果您确保 m 是 2 的幂,则可以预先计算 mm1 = m - 1 并将计算更改为 ((a * x + b) % P) & mm1 ,用更便宜的位掩码操作替换更昂贵的余数操作,但除非 P 很大(最少数百位),否则解释器开销可能会超过余数和位掩码之间的差异。

如果您确实需要性能,并且您正在使用的类型适合 C 级原始类型,那么您可能会受益于编写将所有值转换为 size_t 的 Python C 扩展, Py_hash_tuint64_t 或任何适合您问题的内容,并将数学作为一组批量转换为 C 类型、C 级数学,然后一次转换回 Python int ,保存一堆字节代码和中间值(立即扔掉) )。

如果值太大而无法适应 C 原语,则可以选择 GMP 类型(查看 mpz_importmpz_export,以实现从 PyLongmpz_t 的高效转换,然后再返回),但看到大量节省的可能性会下降;一般来说,GMP 的数学运算速度更快,并且可以就地改变数字,而不是创建和销毁大量临时数字,但即使使用 mpz_importmpz_export ,Python 和 GMP 类型之间的转换成本也可能会消耗掉大部分节省的成本。

关于Python:具有内置库的更快的通用哈希函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46481089/

相关文章:

python - Azure 和 Databricks 寄予厚望

node.js - 根据mongodb '_id`属性创建hashid

hash - Visual Basic 6.0 哈希函数

arrays - Ruby 将数组映射到哈希

python - 运行 pyinstaller 时出错(1920、 'LoadLibraryEx'、 'System cannot access the file')

python - 这个警告在 PATE 分析中意味着什么?

Python 控制台模块无法键入 Tab 键

python - 随机森林中的超参数调整

security - SHA-2 哈希是否使用 key ?

c - 如何为另一个结构体中的结构体分配内存?