středa 18. června 2014

Python vs. C#

Při své práci jsem měl možnost porovnat výkon výpočetně náročné aplikace napsané v Pythonu a následně přepsané do C#.

Byla by škoda výsledky jen tak vhodit do propadliště dějin (papírek do sběru). No a je také možné, že se to někomu bude hodit...


Vo co go?


Při zpracování rozptylových studií se v České republice používá metodika SYMOS'97 (Systém modelování stacionárních zdrojů). Velmi jednoduchý výpočet lze sice provést ručně, v praxi se používá nějaký program.

Zjednodušeně lze říct, že se počítá příspěvek zdroje/ů znečištění do referenčního/ch bodů. Ve výpočtu jsou zohledněny vzdálenosti a terén mezi zdrojem znečištění a referenčním bodem, meteorologické podmínky, parametry zdroje, škodlivá látka atd...

V aplikaci to pak vypadá tak, že je v sobě vnořeno 5 cyklů (zdroje, ref. body, třídy stability, rychlosti větru a směry větru), většina výpočtů probíhá v nejvnitřnějším cyklu. Čtivě problematiku zpracoval Bc. Karel Psota, který také implementoval výpočet do Pythonu.

Jako přidruženou výrobu vyvíjíme ve firmě komerční verzi Symosu, použitý algoritmus je již notně vousatý a je velmi obtížně paralelizovatelný, proto jsme se rozhodli jej přepracovat a posunout jej výkonově dál.

V rámci předběžných studií na mě padlo testování výše uvedeného OpenSymosu. Jeho implementace v Pythonu výkonem neoslnila, přepsal jsem ji do C#. No a tak vznikly nějaké statistiky, o které se s vámi podělím.

Testovací prostředí

Testy proběhly na počítači s procesorem Intel Core i7-2600 3.4GHz (4 jádra, 8 threadů) s pamětí RAM 8 GB a diskem Samsung SSD 840 PRO (450 GB).

Programovalo se v jazyce Python 2.7 (detailně viz. specifikace OpenSymos), dále pak v C# (MS Visual Studio 2013, .NET 4.5.1).

Počítaly se průměrné roční koncentrace pro 360 referenčních bodů a jeden bodový zdroj znečištění (SO2). Výpočet probíhal na rovině, tedy bez výškopisu.

Výsledky testování


  • OpenSymos (Python, sekvenční výpočet): 4305 s (12 sec/ref.bod)
  • OpenSymos (C#, sekvenční výpočet): 155 s (0.43 sec/ref.bod)
  • OpenSymos (C#, paralelizovaný výpočet): 35 s (0.097 sec/ref.bod)
  • Symos'97 v2014 (C#, sekvenční výpočet): 4 s (0.011 sec./ref.bod)
  • Symos'97 parallel (C#, paralelizovaný výpočet): 0.43 s (0.0012 sec/ref.bod)

Poznámky

  • Aplikace byla z Pythonu do C# jen překlopena, neproběhly žádné optimalizace, pouze zásahy související s tím, aby to jelo.
  • Pokud máte chuť experimentovat třeba s nějakou kompilovanou verzí Pythonu, soubory pro testovací výpočty vám zašlu a výsledky rád uveřejním.
  • Paralelizace OpenSymosu se přímo nabízela a nebyla implementačně příliš náročná, stačilo doplnit zámky na některé datové struktury a paralelizovat vhodný cyklus. K dalšímu zvýšení výkonu by však už byla nutná dosti brutální optimalizace průchodů cykly, něco ve stylu Symos'97 v2013/2014.
  • Symos'97 v2014 byl ve vývojové verzi s výpočtem podle upravených vztahů dle poslední vyhlášky (změny neovlivnily výkon)

Další informace



Žádné komentáře:

Okomentovat