相关疑难解决方法(0)

如何使用 StdLib 和 Python 3 在一定范围内并行化迭代?

我几天来一直在寻找这个问题的答案,但没有结果。我可能只是不理解那些漂浮在外面的部分,并且该multiprocessing模块的 Python 文档相当大,对我来说不清楚。

假设您有以下 for 循环:

import timeit


numbers = []

start = timeit.default_timer()

for num in range(100000000):
    numbers.append(num)

end = timeit.default_timer()

print('TIME: {} seconds'.format(end - start))
print('SUM:', sum(numbers))
Run Code Online (Sandbox Code Playgroud)

输出:

TIME: 23.965870224497916 seconds
SUM: 4999999950000000
Run Code Online (Sandbox Code Playgroud)

对于此示例,假设您有一个 4 核处理器。有没有办法总共创建 4 个进程,其中每个进程都在单独的 CPU 核心上运行,并且完成速度大约快 4 倍,因此 24 秒/4 个进程 = 约 6 秒?

以某种方式将 for 循环分成 4 个相等的块,然后将这 4 个块添加到数字列表中以等于相同的总和?有一个 stackoverflow 线程:Parallel Simple For Loop但我不明白。谢谢大家。

python parallel-processing range multiprocessing python-3.x

5
推荐指数
1
解决办法
2468
查看次数

在Jupyter Notebook中使用Joblib时不显示打印输出

因此,我正在使用joblib来并行化一些代码,并且我注意到在jupyter笔记本中使用它时无法打印内容。

我尝试在ipython中使用相同的示例,但效果很好。

这是在jupyter笔记本单元中编写的最小(非)工作示例

from joblib import Parallel, delayed
Parallel(n_jobs=8)(delayed(print)(i) for i in range(10))
Run Code Online (Sandbox Code Playgroud)

所以我得到的输出,[None, None, None, None, None, None, None, None, None, None]但什么都没有打印。

实际上,在检查笔记本进程的日志时,我注意到打印在那里进行。我希望打印发生在笔记本中,而不是笔记本过程的日志中。

编辑

我已经打开了一个Github问题,但是到目前为止关注的很少。

python printing joblib jupyter jupyter-notebook

5
推荐指数
2
解决办法
133
查看次数

从 DataFrame 列表中初始化 Pandas 系列较慢

我发现如果我们从 DataFrame 列表中初始化 pandas Series 对象,速度会非常慢。例如下面的代码:

import pandas as pd
import numpy as np

# creating a large (~8GB) list of DataFrames.
l = [pd.DataFrame(np.zeros((1000, 1000))) for i in range(1000)]

# This line executes extremely slow and takes almost extra ~10GB memory. Why?
# It is even much, much slower than the original list `l` construction.
s = pd.Series(l)
Run Code Online (Sandbox Code Playgroud)

最初我认为 Series 初始化意外地深度复制了 DataFrame,这使得它变慢,但事实证明它只是像=python 中通常那样通过引用复制。

另一方面,如果我只是创建一个系列并手动浅复制元素(在 for 循环中),那么速度会很快:

# This for loop is faster. Why?
s1 = pd.Series(data=None, index=range(1000), …
Run Code Online (Sandbox Code Playgroud)

python dataframe pandas

5
推荐指数
1
解决办法
410
查看次数

在函数中执行循环多重处理的最快方法?

1.我有一个函数var。我想知道通过利用系统拥有的所有处理器、内核、线程和 RAM 内存进行多处理/并行处理来快速运行此函数中的循环的最佳方法。

import numpy
from pysheds.grid import Grid

xs = 82.1206, 72.4542, 65.0431, 83.8056, 35.6744
ys = 25.2111, 17.9458, 13.8844, 10.0833, 24.8306

a = r'/home/test/image1.tif'
b = r'/home/test/image2.tif'

def var(interest):
    
    variable_avg = []
    for (x,y) in zip(xs,ys):
        grid = Grid.from_raster(interest, data_name='map')

        grid.catchment(data='map', x=x, y=y, out_name='catch')

        variable = grid.view('catch', nodata=np.nan)
        variable = numpy.array(variable)
        variablemean = (variable).mean()
        variable_avg.append(variablemean)
    return(variable_avg)

Run Code Online (Sandbox Code Playgroud)

2.var如果我可以针对给定的函数多个参数并行运行函数和循环,那就太好了。var(a)例如:var(b)同时。因为它比单独并行化循环消耗的时间要少得多。

如果没有意义,请忽略 2。

python parallel-processing multithreading multiprocessing python-asyncio

4
推荐指数
1
解决办法
2943
查看次数

在 Jupyter Notebook 中并行化绘图循环

我使用的是 Python 版本 3.5.1。我想并行化一个循环,该循环用于使用 imshow 绘制一组数组。没有任何并行化的最小代码如下

import matplotlib.pyplot as plt
import numpy as np

# Generate data

arrays   = [np.random.rand(3,2) for x in range(10)]
arrays_2 = [np.random.rand(3,2) for x in range(10)]

# Loop and plot sequentially

for i in range(len(arrays)):

    # Plot side by side

    figure = plt.figure(figsize = (20, 12))
    ax_1 = figure.add_subplot(1, 2, 1)
    ax_2 = figure.add_subplot(1, 2, 2)

    ax_1.imshow(arrays[i], interpolation='gaussian', cmap='RdBu', vmin=0.5*np.min(arrays[i]), vmax=0.5*np.max(arrays[i]))
    ax_2.imshow(arrays_2[i], interpolation='gaussian', cmap='YlGn', vmin=0.5*np.min(arrays_2[i]), vmax=0.5*np.max(arrays_2[i]))

    plt.savefig('./Figure_{}'.format(i), bbox_inches='tight')
    plt.close()
Run Code Online (Sandbox Code Playgroud)

该代码目前是在 Jupyter 笔记本中编写的,我想仅通过 Jupyter 笔记本进行所有处理。虽然这种方法效果很好,但实际上我有 2500 …

python parallel-processing

3
推荐指数
1
解决办法
881
查看次数