2014 dxdy logo

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

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




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


20/10/12
235
Добрый день, уважаемые участники форума!
Есть функция $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
4292
Аделаида
Заметьте, там Python 2. Вот ассинхроность на Python 3: https://tproger.ru/translations/asynchr ... in-python/

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


26/05/14
981
Если вы запустите несколько процессов то ускорение будет примерно пропорционально числу ядер в процессоре.
Посмотрите на 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
11177
Россия, Москва
А возможно некоторые части формул внутри функции не зависят от некоторых [комбинаций] аргументов (или симметричны по ним и потому равны) и их можно вычислять заранее (или сохранять между узлами сетки). Плюс можно поделить функцию на блоки для умещения в кэши процессора, это тоже ускоряет некоторые виды вычислений.
Но самый практичный универсальный совет - попытаться задействовать GPU, при удаче и некоторых усилиях выигрыш будет обязательно (и часто заметно больше выигрыша от 2-4-х ядерного CPU).

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


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

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

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

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


29/12/13
306
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
8464
Цюрих
Seman в сообщении #1348304 писал(а):
можно сказать "асинхронность" - разновидность "параллельности"

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

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


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

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


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


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

-- 22.10.2018, 12:32 --

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


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

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

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


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

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


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

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


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

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

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


16/07/14
8464
Цюрих
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
25179
mihaild в сообщении #1348333 писал(а):
Там же специально sleep'ы вставлены.
Ну естественно. :-)
mihaild в сообщении #1348333 писал(а):
Если в фреймворке есть автоматическое раскидывание фьючерсов по потокам, то это можно использовать, и скорее всего будет проще, чем руками потоки создавать. А ТС нужно показать код:)
По-видимому, да. Правда, еще лучше было бы не только показать код, но и описать исходную задачу. А то у меня есть сильные подозрения, что первое (и, вполне возможно, последнее) действие, которое надо сделать для увеличения производительности - сменить язык (или, по крайней мере, тщательно оптимизировать что-нибудь вроде перегонки данных в NumPy и обратно, обычно именно это - самое узкое место при попытках счета на Python'е).

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

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



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

Сейчас этот форум просматривают: YandexBot [bot]


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

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