распараллеливать цикл for for Python 3

Вот довольно понятная версия, использующая синтаксис метода:

IEnumerable<JoinPair> outerLeft =
    lefts.SelectMany(l => 
        rights.Where(r => l.Key == r.Key)
              .DefaultIfEmpty(new Item())
              .Select(r => new JoinPair { LeftId = l.Id, RightId = r.Id }));
0
задан Nirav L Lekinwala 13 July 2018 в 12:59
поделиться

1 ответ

Я предполагаю, что вы хотите работать с несколькими файлами одновременно. Для этого лучший способ (на мой взгляд) - использовать multiprocessing. Чтобы использовать это, вам нужно определить элементарный шаг, и это уже сделано в вашем коде.

import numpy as np
import multiprocessing as mp
import os

def compute(file):
    mindex=np.zeros((1200,1200))
    for i in range(1200):
        var1 = xray.open_dataset(file)['variable'][:,i,:].data
        for j in range(1200):
            var2 = var1[:,j]
            ## Mathematical Calculations to find var3[i,j]## 
            mindex[i,j] = var3[i,j]
    return (file, mindex)


if __name__ == '__main__':
    N= mp.cpu_count()

    files = os.scandir(folder)

    with mp.Pool(processes = N) as p:
        results = p.map(f, [file.name for file in files])

Это должно вернуть список элементов results, в котором каждый элемент является кортежем с имя файла и матрицу mindex. При этом вы можете работать с несколькими файлами одновременно. Это особенно эффективно, если вычисление для каждого файла длинное.

0
ответ дан Mathieu 17 August 2018 в 12:48
поделиться
  • 1
    Обратите внимание, что многопоточность также отлично работает , если вычислительная часть выполнена с помощью numpy. – Vincent 13 July 2018 в 13:26
  • 2
    @Vincent True numpy действительно переключается на C. – Mathieu 13 July 2018 в 13:31
  • 3
    @Vincent Тем не менее, может потребоваться дополнительная адаптация кода, особенно для работы с массивом для получения mindex вместо этого цикла double for. – Mathieu 13 July 2018 в 13:38
  • 4
    Поскольку большую часть времени, вероятно, тратится во время операций ввода-вывода и функций numpy, я ожидал бы, что mp.pool.ThreadPool достигнет той же производительности (может быть, даже лучше, поскольку mindex не нужно сериализовать). Однако для этого потребуется контрольный показатель. – Vincent 13 July 2018 в 13:56
Другие вопросы по тегам:

Похожие вопросы: