如何使字典乘法更快?
How to make dictionary multiplication faster?
有没有办法让函数 f()
更快。我 运行 它已经上亿次了,所以如果能提高速度,我们将不胜感激。字典a
和b
的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 本身。字典查找本身已经高度优化。同样,乘以常数也没有捷径。
有没有办法让函数 f()
更快。我 运行 它已经上亿次了,所以如果能提高速度,我们将不胜感激。字典a
和b
的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 本身。字典查找本身已经高度优化。同样,乘以常数也没有捷径。