在Python中,multiprocessing模块可用于并行运行一系列值的函数.例如,这将生成f的前100000个评估的列表.
def f(i):
return i * i
def main():
import multiprocessing
pool = multiprocessing.Pool(2)
ans = pool.map(f, range(100000))
return ans
Run Code Online (Sandbox Code Playgroud)
当f接受多个输入但只有一个变量变化时,可以做类似的事情吗?例如,您将如何并行化:
def f(i, n):
return i * i + 2*n
def main():
ans = []
for i in range(100000):
ans.append(f(i, 20))
return ans
Run Code Online (Sandbox Code Playgroud) 我创建的python程序是IO有界的.大多数时间(超过90%)花费在单个循环中,重复约10,000次.在这个循环中,生成~100KB的数据并写入临时文件; 然后由另一个程序读回,并收集有关所收集数据的统计数据.这是将数据传递到第二个程序的唯一方法.
由于这是主要的瓶颈,我认为将临时文件的位置从我的主硬盘移动到(~40MB)RAMdisk(超过2GB的可用RAM内)将大大提高该文件的IO速度,从而减少运行时.但是,我获得了以下结果(每次平均超过20次运行):
看起来RAMdisk比我的HDD慢.
可能是什么导致了这个?
有没有其他替代方法使用RAMdisk以获得更快的文件IO?
我需要确定一组点(每个由浮点元组给出,每个都在[0,1]中)包含两个在彼此的某个阈值(例如0.01)内的点.我还要提一下,在我感兴趣的问题版本中,这些"点"由长度为〜30的元组给出,即它们是[0,1] ^ 30中的点.
我可以使用以下内容测试是否有任何两个在此阈值内:
def is_near(p1, p2):
return sqrt(sum((x1 - x2)**2 for x1, x2 in zip(p1, p2))) < 0.01 # Threshold.
Run Code Online (Sandbox Code Playgroud)
使用这个我可以使用以下内容检查每一对:
def contains_near(points):
from itertools import combinations
return any(is_near(p1, p2) for p1, p2 in combinations(points, r=2))
Run Code Online (Sandbox Code Playgroud)
然而,这在列表的长度上是二次的,这对于我所拥有的长点列表来说太慢了.
有没有解决这个问题的方法?
我尝试过将这些点捕捉到网格中,这样我就可以使用字典/哈希映射来存储它们:
def contains_near_hash(points):
seen = dict()
for point in points:
# The rescaling constant should be 1 / threshold.
grid_point = tuple([round(x * 100, 0) for x in point])
if grid_point in seen:
for other in seen[grid_point]:
if is_near(point, other):
return …Run Code Online (Sandbox Code Playgroud)