Nano Hash - криптовалюты, майнинг, программирование

Многопроцессорная обработка двух функций с использованием и изменением одного и того же списка

У меня есть 4 списка по 3 поплавка в каждом. У меня есть две функции (на самом деле реализованные как одна функция - другой аргумент int изменяет элемент списков, на который он действует), которые я хочу запускать параллельно. Они оба берут все списки и используют их для некоторых вычислений. Результаты первой функции — 4 числа с плавающей запятой — по одному для каждого списка — предназначены для изменения второго элемента каждого списка, а результаты второй функции предназначены для изменения третьего элемента во всех списках. Затем я хочу перейти к следующей итерации, где функции делают то же самое, но с обновленными списками (первый элемент во всех них остается постоянным).

Простой код для представления моей идеи

l1 = [a,b,c]
l2 = [d,e,f]
l3 = [g,h,i]
l4 = [j,k,l]
def func(l1, l2, l3, l4, k):
    do something with the lists on element k of them
    return (x1, x2, x3, x4, k)

pool = multi.Pool(processes = 2)
while nstep <= maxnsteps:
    for i in range(1,3):
        pool.apply_async(func, args = (xval, yval, vxval, vyval, i,))
    nstep = nstep + 1
pool.close()
pool.join()

Итак, для следующего значения nstep я хочу, чтобы функции использовали обновленные версии списков со значениями, которые они вычислили на предыдущей итерации. У меня такое чувство, что я совершенно неправильно говорю об этом.

18.05.2014

  • Выполнение func занимает много времени? В противном случае использование многопроцессорной обработки таким образом может быть медленнее, чем последовательный код. 18.05.2014
  • Немного, я делал это в начале последовательно, но maxnsteps — это очень большое число, поэтому мне нужен способ ускорения процесса — поэтому я пошел на многопроцессорность — я даже не уверен, что это лучший способ используйте модуль здесь 18.05.2014
  • То, что два (коротких) вызова func должны завершиться перед переходом к следующей итерации, делает проблему несовместимой с параллельной обработкой. 18.05.2014
  • Так какой у вас здесь вопрос? Если вы хотите узнать, достаточно ли быстр ваш код, просто попробуйте свой подход. Но сначала спросите себя, хотите ли вы двухкратного ускорения (скорее, меньшего). В противном случае попробуйте оптимизировать функцию с помощью профилировщика производительности и/или использовать pypy вместо интерпретатора python. 19.05.2014
  • Я хочу знать, возможно ли следующее: У вас есть список со значениями. Несколько функций принимают эти значения и одновременно выполняют с ними некоторые вычисления, а затем каждая функция изменяет другое значение списка. И это я хочу, чтобы была одна итерация цикла - на следующем шаге цикла они делают то же самое, но с обновленным списком со значениями. Проблема заключается в том, что каждой функции нужны все значения списка для выполнения вычислений, но затем она изменяет только 1 элемент списка. 19.05.2014

Ответы:


1

Вот код без многопроцессорности. Вам необходимо скопировать списки перед их обработкой с помощью l1_copy1=list(l1). Затем вы можете объединить измененные списки из двух функций, таких как new_l1=[l1_copy1[0], l1_copy2[1], l1[2]] и т. д. Еще одно замечание; используйте матрицу или создайте матрицу классов для хранения списков, чтобы вы могли перебирать их.

l1 = [1,2,3]
l2 = [4,5,6]
l3 = [7,8,9]
l4 = [10,11,12]

def increment_at_position_k(l1, l2, l3, l4, k):
    l1, l2, l3, l4 = list(l1), list(l2), list(l3), list(l4) # copy lists (otherwise the list is modified directly)
    l1[k] += 1
    l2[k] += 1
    l3[k] += 1
    l4[k] += 1
    return (l1, l2, l3, l4, k)

for iterations in [0]:
    results = []
    for i in [1,2]:
        ret = increment_at_position_k(l1, l2, l3, l4, i)
        results.append(ret)
    for res in results:
        local_l1, local_l2, local_l3, local_l4, k = res # unpack result
        #update global list
        l1[k] = local_l1[k]
        l2[k] = local_l2[k]
        l3[k] = local_l3[k]
        l4[k] = local_l4[k]
print l1
print l2
print l3
print l4
21.05.2014
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..