Чи буде багатопроцесорувати хорошим рішенням для цієї операції?

while True:

    Number = len(SomeList)

    OtherList = array([None]*Number)

    for i in xrange(Number):
        OtherList[i] = (Numpy Array Calculation only using i_th element of arrays, Array_1, Array_2, and Array_3.)

'Число' кількість елементів у OtherList та інших масивах може бути розрахована окремо. Однак, оскільки програма залежить від часу, ми не можемо продовжувати роботу, поки не буде оброблено всі елементи "Число".

Чи буде багатопроцесорувати хорошим рішенням для цієї операції? Я маю максимально прискорити цей процес. Якщо це краще, будь ласка, запропонуйте код, будь ласка.

1
Інша справа в тому, що багато операцій numpy скидають пітон Global Interpreter Lock (GIL), щоб ви могли використовувати багатопоточку, а не багатопроцесорну для багатьох речей в numpy. Я вважаю, що це швидше, але threadafe може бути проблемою.
додано Автор Brian Larsen, джерело
Багатофункціональна обробка може бути гарним рішенням, якщо час виконання одного обчислення перевищить час, необхідний для створення підпроцесів, розподіл даних для них та збирання результатів. І це припускає, що кілька процесорів доступні для роботи паралельно - немає сенсу запускати кілька процесів на одному процесорі. Якщо час розрахунку суттєво не перевищує накладних витрат на процес, багатопроцесорні роботи не допоможуть значно.
додано Автор Dave, джерело
У вас є робочий код, який є занадто повільним? Ви його прорекламували?
додано Автор Steven Rumbalski, джерело
len (Номер) не вдасться, тому що ви не можете взяти довжину числа. array ([None] * Number) виглядає повільним способом створення масиву, оскільки воно створює перший список Python рівних розмірів. Можливо, вам слід створити свій масив за допомогою empty або нулів .
додано Автор Steven Rumbalski, джерело
Також, наскільки складним є єдиний розрахунок?
додано Автор Steven Rumbalski, джерело
Там завжди перетворюється на рядок спочатку, потім набирає довжину. len (str (Number))
додано Автор John Doe, джерело

2 Відповіді

It is possible to use numpy arrays with multiprocessing but you shouldn't do it yet.

Прочитайте Посібник для початківців щодо використання Python для обчислень продуктивності та його Версія Cython: прискорення роботи Python (NumPy, Cython і Weave) .

Не знаючи, які конкретні розрахунки або розміри масивів, ось загальні рекомендації в жодному конкретному порядку:

  • measure performance of your code. Find hot-spots. Your code might load input data longer than all calculations. Set your goal, define what trade-offs are acceptable
  • check with automated tests that you get expected results
  • check whether you could use optimized libraries to solve your problem
  • make sure algorithm has adequate time complexity. O(n) algorithm in pure Python can be faster than O(n**2) algorithm in C for large n
  • use slicing and vectorized (automatic looping) calculations that replace the explicit loops in the Python-only solution.
  • rewrite places that need optimization using weave, f2py, cython or similar. Provide type information. Explore compiler options. Decide whether the speedup worth it to keep C extensions.
  • minimize allocation and data copying. Make it cache friendly.
  • explore whether multiple threads might be useful in your case e.g., cython.parallel.prange(). Release GIL.
  • Compare with multiprocessing approach. The link above contains an example how to compute different slices of an array in parallel.
  • Iterate
4
додано
Хороша порада! Насправді, ви можете використовувати чисельні масиви досить приємно з багатопроцесорними. Я роблю це весь час. Ви просто повинні знати, що найпростіший спосіб це зробити - це не використання спільної пам'яті. multiprocessing дозволить вам вилучити їх і відправити їх назад, як і будь-який інший об'єкт python. Очевидно, що це має великі накладні витрати, і буде копіювати кожен «шматок», тому фокус (анти-нейтумі) працювати в відносно великих шматках. Це залежить від проблеми, але в деяких випадках ви можете отримати дуже приємні прискорення в деяких випадках із досить прямолінійним підходом multiprocessing.pool + numpy .
додано Автор Joe Kington, джерело
Все, що було сказано, я згоден, multiprocessing , ймовірно, не відповідає проблемі OP, і їх краще оптимізувати іншими способами.
додано Автор Joe Kington, джерело
Дякую! Я краще витрачу час на оптимізацію мого коду.
додано Автор user989746, джерело

Оскільки у вас є пропозиція , while True , я вважаю, що ви будете працювати багато, якщо ітерації, таким чином, потенційні прибутки в остаточному підсумку перевершують уповільнення від нересту багатопроцесорного пулу. Я також вважаю, що у вас є більше одного логічного ядра на вашій машині з очевидних причин. Тоді питання стає, якщо вартість серіалізації входів і де-серіалізація результату компенсується здобутком.

Найкращий спосіб дізнатись, чи є щось, що потрібно отримати, на мій досвід, це спробувати це. Я б сказав, що:

  • Ви передаєте будь-які постійні входи в момент початку. Таким чином, якщо будь-який з Array_1, Array_2 та Array_3 ніколи не змінюється, передайте його як args під час виклику Process() . Таким чином, ви зменшите кількість даних, які потрібно вибирати та передавати через IPC (це те, що робить multiprocessing )
  • Ви використовуєте робочу чергу та додавайте до неї завдання, як тільки вони доступні. Таким чином, ви можете переконатися, що завжди чекає більше роботи, коли процес виконується з завданням.
0
додано
ІТ КПІ - Python
ІТ КПІ - Python
625 учасників

Канал обговорень про всякі штуки зі світу пайтону. Прохання: 0. мати повагу одне до одного; 1. не матюкатися в сторону людей; 2. не захламляти тред повідомленнями по одному слову;