如何使字典乘法更快?

How to make dictionary multiplication faster?

有没有办法让函数 f() 更快。我 运行 它已经上亿次了,所以如果能提高速度,我们将不胜感激。字典ab的ID在运行s中是相同的,w是一个常量。键是整数;密钥一般分布不均匀。

此外,该函数位于 class 对象中。所以f就是f(self),变量是self.w、self.ID、self.a、self.b

w = 10.25
ID = range(10)
a = {}
b = {}

for i in ID:
    a[i] = random.uniform(0,1)
    b[i] = random.uniform(0,1)

def f():
    for i in ID:
        a[i] = b[i] * w

t0 = time.time()
for i in xrange(1000000):
    f()
t1 = time.time()
print t1-t0

您可以通过本地化 f():

中的变量来获得很好的加速
def f(ID=ID, a=a, b=b, w=w):
    for i in ID:
        a[i] = b[i] * w

有些人不喜欢以这种方式进行本地化,因此您还可以构建一个闭包来加快全局变量访问速度:

def make_f(a, b, w, ID):
    def f():
        for i in ID:
            a[i] = b[i] * w
    return f

f = make_f(a, b, w, ID)

查看 this analysis 哪种类型的变量访问速度最快。

从算法上讲,没有什么可以做的了。 ID 的循环很快,因为它只是增加现有整数的引用计数。整数的散列实际上是即时的,因为 int 的散列是 int 本身。字典查找本身已经高度优化。同样,乘以常数也没有捷径。