我有一个交易者交易的数据集df
。
我有2个for循环级别,如下所示:
smartTrader =[]
for asset in range(len(Assets)):
df = df[df['Assets'] == asset]
# I have some more calculations here
for trader in range(len(df['TraderID'])):
# I have some calculations here, If trader is successful, I add his ID
# to the list as follows
smartTrader.append(df['TraderID'][trader])
# some more calculations here which are related to the first for loop.
我想在Assets
中并行化每个资产的计算,我还希望为每个资产的每个交易者并行计算。完成所有这些计算后,我想根据smartTrader
列表进行额外的分析。
这是我第一次尝试并行处理,所以请耐心等待我,感谢您的帮助。
答案 0 :(得分:2)
如果使用提供pathos
分叉的multiprocessing
,则可以轻松嵌套并行映射。 pathos
用于轻松测试嵌套并行映射的组合 - 嵌套for循环的直接转换。
它提供了一系列阻塞,非阻塞,迭代,异步,串行,并行和分布式映射。
>>> from pathos.pools import ProcessPool, ThreadPool
>>> amap = ProcessPool().amap
>>> tmap = ThreadPool().map
>>> from math import sin, cos
>>> print amap(tmap, [sin,cos], [range(10),range(10)]).get()
[[0.0, 0.8414709848078965, 0.9092974268256817, 0.1411200080598672, -0.7568024953079282, -0.9589242746631385, -0.27941549819892586, 0.6569865987187891, 0.9893582466233818, 0.4121184852417566], [1.0, 0.5403023058681398, -0.4161468365471424, -0.9899924966004454, -0.6536436208636119, 0.2836621854632263, 0.9601702866503661, 0.7539022543433046, -0.14550003380861354, -0.9111302618846769]]
此示例使用处理池和线程池,其中线程映射调用是阻塞的,而处理映射调用是异步的(请注意最后一行末尾的get
)。
在此处获取pathos
:https://github.com/uqfoundation
或者:
$ pip install git+https://github.com/uqfoundation/pathos.git@master
答案 1 :(得分:1)
嵌套并行性可以通过Ray优雅地完成,该系统使您可以轻松地并行化和分发Python代码。
假设您要并行化以下嵌套程序
def inner_calculation(asset, trader):
return trader
def outer_calculation(asset):
return asset, [inner_calculation(asset, trader) for trader in range(5)]
inner_results = []
outer_results = []
for asset in range(10):
outer_result, inner_result = outer_calculation(asset)
outer_results.append(outer_result)
inner_results.append(inner_result)
# Then you can filter inner_results to get the final output.
下面是将上述代码并行化的Ray代码:
@ray.remote decorator
用于我们要在其进程中同时执行的每个函数。远程功能返回的是Future(即结果的标识符),而不是结果本身。 f()
的{{1}}修饰符,即remote
f.remote()
帮助函数将嵌套的id列表转换为值。 请注意,程序结构相同。您只需要添加ids_to_vals()
,然后使用remote
帮助函数将远程函数返回的期货(id)转换为值。
ids_to_vals()
与multiprocessing模块相比,使用Ray有许多优点。特别是,相同的代码将在单台计算机以及多台计算机上运行。有关Ray的更多优点,请参见this related post。
答案 2 :(得分:0)
不使用for
,而是使用map
:
import functools
smartTrader =[]
m=map( calculations_as_a_function,
[df[df['Assets'] == asset] \
for asset in range(len(Assets))])
functools.reduce(smartTradder.append, m)
从那时起,您可以尝试不同的并行map
实现s.a. multiprocessing
's或stackless
'
答案 3 :(得分:0)
从标准python库中进行线程化可能是最方便的方法:
import threading
def worker(id):
#Do you calculations here
return
threads = []
for asset in range(len(Assets)):
df = df[df['Assets'] == asset]
for trader in range(len(df['TraderID'])):
t = threading.Thread(target=worker, args=(trader,))
threads.append(t)
t.start()
#add semaphore here if you need synchronize results for all traders.