对于C++,我们可以使用OpenMP进行并行编程; 但是,OpenMP不适用于Python.如果我想并行我的python程序的某些部分,我该怎么办?
代码的结构可以被认为是:
solve1(A)
solve2(B)
Run Code Online (Sandbox Code Playgroud)
哪里solve1
和solve2
是两个独立的功能.如何并行运行这种代码而不是按顺序运行以减少运行时间?希望可以有人帮帮我.首先十分感谢.代码是:
def solve(Q, G, n):
i = 0
tol = 10 ** -4
while i < 1000:
inneropt, partition, x = setinner(Q, G, n)
outeropt = setouter(Q, G, n)
if (outeropt - inneropt) / (1 + abs(outeropt) + abs(inneropt)) < tol:
break
node1 = partition[0]
node2 = partition[1]
G = updateGraph(G, node1, node2)
if i == 999:
print "Maximum iteration reaches"
print inneropt
Run Code Online (Sandbox Code Playgroud)
setinner和setouter是两个独立的函数.这就是我要平行的地方......
让我们说我们有一个函数添加如下
def add(x, y):
return x + y
Run Code Online (Sandbox Code Playgroud)
我们想为数组应用map函数
map(add, [1, 2, 3], 2)
Run Code Online (Sandbox Code Playgroud)
语义是我想为数组的每个元素添加2.但是该map
函数也需要第三个参数中的列表.
注意:为了简单起见,我将添加示例.我原来的功能要复杂得多.当然,设置y
添加功能的默认值的选项是不可能的,因为它将针对每个呼叫进行更改.
R包多核具有函数mclapply(),它将特定函数应用于事物列表并利用多个核心.它易于使用并可大幅提升速度.
是否有Python等价物?谢谢
因此,我经常按照以下模式编写代码:
_list = list(range(10)) # Or whatever
_list = [some_function(x) for x in _list]
_list = [some_other_function(x) for x in _list]
Run Code Online (Sandbox Code Playgroud)
等等
我现在在另一个问题上看到一条评论,它解释了这种方法每次如何创建一个新列表,最好对现有列表进行变异,如下所示:
_list[:] = [some_function(x) for x in _list]
Run Code Online (Sandbox Code Playgroud)
这是我第一次看到此明确建议,我想知道其中的含义是什么:
1)突变是否节省内存?大概是在重新分配后对“旧”列表的引用将降为零,而“旧”列表将被忽略,但是在此之前会有延迟,此时我可能会使用比我使用时所需的更多内存重新分配而不是更改列表?
2)使用变异有计算成本吗?我怀疑就地更改某些内容比创建一个新列表并删除旧列表更昂贵?
在安全性方面,我编写了一个脚本对此进行测试:
def some_function(number: int):
return number*10
def main():
_list1 = list(range(10))
_list2 = list(range(10))
a = _list1
b = _list2
_list1 = [some_function(x) for x in _list1]
_list2[:] = [some_function(x) for x in _list2]
print(f"list a: {a}")
print(f"list b: {b}")
if __name__=="__main__":
main()
Run Code Online (Sandbox Code Playgroud)
哪个输出:
list a: [0, …
Run Code Online (Sandbox Code Playgroud) 我写了这样的代码:
def process(data):
#create file using data
all = ["data1", "data2", "data3"]
Run Code Online (Sandbox Code Playgroud)
我想在我的所有列表上并行执行进程函数,因为它们正在创建小文件,所以我不关心磁盘写入,但处理需要很长时间,所以我想使用我的所有内核。
如何使用 python 2.7 中的默认模块执行此操作?