2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Ускорение кода на Python
Сообщение20.10.2018, 21:35 


20/10/12
233
Добрый день, уважаемые участники форума!
Есть функция $F(a,b,...)$ от нескольких параметров, значения которой я вычисляю на Python.
Функция не слишком тривиальная (сумма интегралов) и я считаю двумерные сетки по ней от разных параметров.
Подсчеты $F$ с разными параметрами независимы, так что есть желание это распараллелить.
Вот здесь https://stackoverflow.com/questions/20548628/how-to-do-parallel-programming-in-python
есть решение с использованием пула процессов. Но там ускорение будет только в 2-4 раза, насколько я понимаю.
Вопрос1: а можно ли сделать быстрее?
Вопрос2: а можно ли сделать быстрее, если вычисление функции будем считать 'привязанным' к коду на Python.

 Профиль  
                  
 
 Re: Ускорение кода на Python
Сообщение21.10.2018, 07:46 


21/05/16
2474
Аделаида
Заметьте, там Python 2. Вот ассинхроность на Python 3: https://tproger.ru/translations/asynchr ... in-python/

 Профиль  
                  
 
 Re: Ускорение кода на Python
Сообщение21.10.2018, 10:40 
Заслуженный участник


26/05/14
733
Если вы запустите несколько процессов то ускорение будет примерно пропорционально числу ядер в процессоре.
Посмотрите на PyPy. Ускорение в несколько раз без изменения кода (в лучшем случае). Это компилятор питона.
Nuitka - тоже компилирует питон.
Эффект от компиляции умножается на эффект от запуска множества процессов.

Другой путь
Есть библиотеки для векторных вычислений, когда один и тот-же код выполняется на множестве входных данных. Потребуется переписать код, но выигрыш может быть значительным. Можно будет задействовать графический процессор. Например Tensorflow понимает код на питоне а исполняет его на всех доступных CPU, GPU со скоростью C/C++. Но, повторюсь, надо будет потратить время.

 Профиль  
                  
 
 Re: Ускорение кода на Python
Сообщение21.10.2018, 19:16 


21/10/18
6
shukshin в сообщении #1347973 писал(а):
Есть функция $F(a,b,...)$ от нескольких параметров, значения которой я вычисляю на Python.

А где код? Как мы можем рассуждать о вашей функции, не видя кода? Возможно вы используете неправильные структуры данных, или неправильно построен процесс вычисления. Есть много тонкостей. Так что пока не выложите код, разговаривать бессмысленно.

 Профиль  
                  
 
 Re: Ускорение кода на Python
Сообщение21.10.2018, 22:42 
Заслуженный участник


20/08/14
5786
Россия, Москва
А возможно некоторые части формул внутри функции не зависят от некоторых [комбинаций] аргументов (или симметричны по ним и потому равны) и их можно вычислять заранее (или сохранять между узлами сетки). Плюс можно поделить функцию на блоки для умещения в кэши процессора, это тоже ускоряет некоторые виды вычислений.
Но самый практичный универсальный совет - попытаться задействовать GPU, при удаче и некоторых усилиях выигрыш будет обязательно (и часто заметно больше выигрыша от 2-4-х ядерного CPU).

 Профиль  
                  
 
 Re: Ускорение кода на Python
Сообщение21.10.2018, 23:05 
Заслуженный участник
Аватара пользователя


16/07/14
3112
Москва
kotenok gav в сообщении #1348023 писал(а):
Вот ассинхроность на Python 3: https://tproger.ru/translations/asynchr ... in-python/
Там про асинхронность, а ТС нужна параллельность.

Без деталей - можно посоветовать только multiprocessing, который, если повезет, даст выигрыш пропорционально числу ядер.

Конкретные советы по оптимизации можно давать только глядя на код.

 Профиль  
                  
 
 Re: Ускорение кода на Python
Сообщение22.10.2018, 11:31 


29/12/13
127
mihaild в сообщении #1348217 писал(а):
Там про асинхронность, а ТС нужна параллельность.

у kotenok gav по теме хорошая ссылка. "асинхронность" это оно и есть. можно сказать "асинхронность" - разновидность "параллельности". :facepalm:

Цитата:
Asynchronous programming is a means of parallel programming in which a unit of work runs separately from the main application thread and notifies the calling thread of its completion, failure or progress.

http://bfy.tw/KTdc

ещё пример добавлю отсюда:

код: [ скачать ] [ спрятать ]
Используется синтаксис Python
#!/usr/bin/env python3

import asyncio  
import time  
from datetime import datetime

async def custom_sleep():  
    print('SLEEP', datetime.now())
    time.sleep(1)

async def factorial(name, number):  
    f = 1
    for i in range(2, number+1):
        print('Task {}: Compute factorial({})'.format(name, i))
        await custom_sleep()
        f *= i
    print('Task {}: factorial({}) is {}\n'.format(name, number, f))

start = time.time()  
loop = asyncio.get_event_loop()

tasks = [  
    asyncio.ensure_future(factorial("A", 3)),
    asyncio.ensure_future(factorial("B", 4)),
]
loop.run_until_complete(asyncio.wait(tasks))  
loop.close()

end = time.time()  
print("Total time: {}".format(end - start))
 


вывод:

код: [ скачать ] [ спрятать ]
Используется синтаксис Text
Task A: Compute factorial(2)
SLEEP 2018-10-22 12:27:08.493247
Task A: Compute factorial(3)
SLEEP 2018-10-22 12:27:09.494627
Task A: factorial(3) is 6

Task B: Compute factorial(2)
SLEEP 2018-10-22 12:27:10.495621
Task B: Compute factorial(3)
SLEEP 2018-10-22 12:27:11.497029
Task B: Compute factorial(4)
SLEEP 2018-10-22 12:27:12.498403
Task B: factorial(4) is 24

Total time: 5.007719993591309
z000@z:~/prj/python/parralel$ ./main.py
Task A: Compute factorial(2)
SLEEP 2018-10-22 12:27:25.535878
Task A: Compute factorial(3)
SLEEP 2018-10-22 12:27:26.537266
Task A: factorial(3) is 6

Task B: Compute factorial(2)
SLEEP 2018-10-22 12:27:27.538705
Task B: Compute factorial(3)
SLEEP 2018-10-22 12:27:28.540087
Task B: Compute factorial(4)
SLEEP 2018-10-22 12:27:29.540672
Task B: factorial(4) is 24

Total time: 5.007037162780762
 

 Профиль  
                  
 
 Re: Ускорение кода на Python
Сообщение22.10.2018, 11:55 
Заслуженный участник
Аватара пользователя


16/07/14
3112
Москва
Seman в сообщении #1348304 писал(а):
можно сказать "асинхронность" - разновидность "параллельности"

Нет, нельзя. Асинхронность - не-последовательное выполнение задач (выполнение сначала части одной задачи, потом части другой, потом опять части первой). Асинхронность вполне может быть и на одном потоке.

 Профиль  
                  
 
 Re: Ускорение кода на Python
Сообщение22.10.2018, 12:16 
Заслуженный участник
Аватара пользователя


02/08/11
5647
К сожалению, асинхронность действительно нередко путают с многопоточностью, в том числе и в разном API, но это неправильно.

 Профиль  
                  
 
 Re: Ускорение кода на Python
Сообщение22.10.2018, 12:24 


29/12/13
127
mihaild в сообщении #1348317 писал(а):
Асинхронность вполне может быть и на одном потоке.


нет не может. Асинхронность на одном потоке это бред. Асинхронное это параллельно это по определению. Потоки это части кода выполняющие параллельно. В примере с факториалом видно наглядно, две задачи работающих параллельно. дальше гугл.

-- 22.10.2018, 12:32 --

warlock66613 в сообщении #1348318 писал(а):
К сожалению, асинхронность действительно нередко путают с многопоточностью, в том числе и в разном API, но это неправильно.


Пример, можно с кодом можно, где и в каком языке такое асинхронно и не параллельно? И что это там тогда означает и зачем такая непараллельность?

Я привел пример с python со стандартной asyncio , наглядно видно, что такое задачи и что они по параллельны. Гуглом куча ссылок из которых, ясно, что асинхронно это параллельно .

 Профиль  
                  
 
 Re: Ускорение кода на Python
Сообщение22.10.2018, 12:55 
Заслуженный участник
Аватара пользователя


01/08/06
2604
Уфа
Seman в сообщении #1348320 писал(а):
Я привел пример с python со стандартной asyncio , наглядно видно, что такое задачи и что они по параллельны.
Просто запустите этот пример на старом компьютере с одноядерным процессором (в принципе, можно, наверное, и на новом запретить все ядра, кроме одного). В этой ситуации по определению две задачи не могут параллельно выполняться (физически только один поток), а асинхронность сохраняется.

 Профиль  
                  
 
 Re: Ускорение кода на Python
Сообщение22.10.2018, 12:57 


05/09/12
2528
Само существование джаваскрипта (или, как его называют некоторые местные уважаемые энтузиасты, джавасквирта) опровергает изложенные выше категоричные тезисы. Но кому нужна реальность, противоречащая собственным убеждениям? :lol:

 Профиль  
                  
 
 Re: Ускорение кода на Python
Сообщение22.10.2018, 13:08 
Супермодератор
Аватара пользователя


09/05/12
18266
Кронштадт
Seman в сообщении #1348304 писал(а):
ещё пример добавлю
Кстати, пример очень показателен. :-) Так замедлить выполнение, вообще говоря, тривиальной задачи еще постараться надо.

Это я к тому, что ТС вообще-то нужны не терминологические споры, а производительный код. Асинхронность, как бы ее не классифицировали, в любом случае сводится к задержке выполнения какой-то части кода по тем или иным причинам, что в заявленном ТС случае очевидно незачем.

 Профиль  
                  
 
 Re: Ускорение кода на Python
Сообщение22.10.2018, 13:38 
Заслуженный участник
Аватара пользователя


16/07/14
3112
Москва
Seman в сообщении #1348320 писал(а):
В примере с факториалом видно наглядно, две задачи работающих параллельно
Кстати не видно - видно, что всё считается синхронно. Чтобы получилось асинхронно нужно 9 строчку заменить на await asyncio.sleep(1). Тогда как раз получим общее время работы 3 секунды.
Seman в сообщении #1348320 писал(а):
Пример, можно с кодом можно, где и в каком языке такое асинхронно и не параллельно? И что это там тогда означает и зачем такая непараллельность?
Ну собственно ваш пример. Если бы фьючерсы считались параллельно, то в вашем примере sleep'ы в A и B запускались одновременно. Еще можете попробовать с помощью asyncio ускорить что-то cpu-bounded (хотя бы просто посчитать sum(range(10**8)) два раза).
Это нужно для случаев, когда в одной из задач CPU простаивает (например, ждем ответа по сети), и можно на том же ядре запустить что-то другое.
Seman в сообщении #1348320 писал(а):
Гуглом куча ссылок из которых, ясно, что асинхронно это параллельно
Проблема в том, что по этой теме пишут очень многие, в ней совсем не разбирающиеся.
Нормальная (вроде) статья, например http://masnun.rocks/2016/10/06/async-py ... ncurrency/
Pphantom в сообщении #1348330 писал(а):
Так замедлить выполнение, вообще говоря, тривиальной задачи еще постараться надо
Там же специально sleep'ы вставлены.
Pphantom в сообщении #1348330 писал(а):
Асинхронность, как бы ее не классифицировали, в любом случае сводится к задержке выполнения какой-то части кода по тем или иным причинам, что в заявленном ТС случае очевидно незачем.
Если в фреймворке есть автоматическое раскидывание фьючерсов по потокам, то это можно использовать, и скорее всего будет проще, чем руками потоки создавать. А ТС нужно показать код:)

-- 22.10.2018, 13:46 --

Seman, собственно даже по вашей ссылке:
Цитата:
As I’ve already mentioned, asynchronous code is running in a single thread

 Профиль  
                  
 
 Re: Ускорение кода на Python
Сообщение22.10.2018, 13:47 
Супермодератор
Аватара пользователя


09/05/12
18266
Кронштадт
mihaild в сообщении #1348333 писал(а):
Там же специально sleep'ы вставлены.
Ну естественно. :-)
mihaild в сообщении #1348333 писал(а):
Если в фреймворке есть автоматическое раскидывание фьючерсов по потокам, то это можно использовать, и скорее всего будет проще, чем руками потоки создавать. А ТС нужно показать код:)
По-видимому, да. Правда, еще лучше было бы не только показать код, но и описать исходную задачу. А то у меня есть сильные подозрения, что первое (и, вполне возможно, последнее) действие, которое надо сделать для увеличения производительности - сменить язык (или, по крайней мере, тщательно оптимизировать что-нибудь вроде перегонки данных в NumPy и обратно, обычно именно это - самое узкое место при попытках счета на Python'е).

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 23 ]  На страницу 1, 2  След.

Модераторы: Toucan, maxal, PAV, Karan, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group