2009-09-30 16 views
5

Czekam na wdrożenie fuzzy kontrolera logicznego opartego na bibliotekach PyFuzzy (Python) lub FFLL (C++).Wydajność Pythona warta kosztów?

Wolę pracować z pythonem, ale nie jestem pewien, czy wydajność będzie akceptowalna w środowisku wbudowanym, w którym będzie działać (zarówno procesor ARM, jak i wbudowany proces x86 przetwarzają zarówno 64 MB pamięci RAM).

Głównym problemem jest to, że czasy reakcji są tak szybkie jak to możliwe (częstotliwość aktualizacji wynosząca 5 Hz + byłaby idealna> wymagany jest 2 Hz). System odczytuje z wielu (prawdopodobnie 5) czujników z portu RS232 i zapewnia 2/3 wyników na podstawie wyników oceny rozmytej.

Czy powinienem się obawiać, że Python będzie zbyt wolny dla tego zadania?

+5

Proponuję testowanie za pomocą prostego prototypu na konkretnej platformie. –

+0

5 Hz nie jest dokładnie szybkim czasem reakcji, jeśli potrzebujesz interakcji człowieka z urządzeniem. –

Odpowiedz

35

Ogólnie nie powinieneś przejmować się wydajnością, dopóki nie zobaczysz, że jest to problem. Ponieważ nie znamy szczegółów Twojej aplikacji, nie możemy powiedzieć, jak by ona działała, gdyby była zaimplementowana w Pythonie. A ponieważ nie wdrożyłeś go jeszcze, nie możesz.

Wprowadź w życie wersję, która najbardziej Ci odpowiada, i możesz wdrożyć ją najszybciej. Następnie sprawdź to. I jeśli jest zbyt powolny, masz trzy opcje, które powinny być wykonywane w kolejności:

  • pierwsze, optymalizacji kodu Pythona
  • Jeśli to nie wystarczy, napisać większość funkcji wydajności krytycznych w C/C++, i wywołaj to z twojego kodu Python
  • I wreszcie, jeśli naprawdę potrzebujesz najwyższej wydajności, być może będziesz musiał przepisać całą rzecz w C++. Ale przynajmniej będziesz miał działający prototyp w Pythonie, a będziesz miał o wiele jaśniejszy pomysł, w jaki sposób powinien on zostać wdrożony. Poznasz pułapki, których należy unikać, i będziesz mieć już poprawną implementację, aby przetestować i porównać wyniki.
+14

+1 przedwczesna optymalizacja jest źródłem wszelkiego zła. –

+4

To jest źródło wszelkiego zła, a to wszystko nad przepełnieniem stosu. – FogleBird

+1

Zgadzam się z firmą jalf we wszystkich punktach. Ponadto, jeśli znaczna część pracy zostanie wykonana za pomocą wywołań biblioteki, nie ma znaczenia, czy wywołasz bibliotekę z C, czy z Pythona. Jeśli używasz wbudowanych funkcji językowych Pythona i modułów bibliotecznych C, możesz nawet nie zauważyć trafienia wydajności dla Pythona; jeśli spróbujesz napisać własną FFT w natywnym Pythonie lub czymś w tym stylu, zobaczysz okropną wydajność. Użyj Pythona, aby napisać części naprawdę wysokopoziomowe i spróbuj pozwolić, aby biblioteki Python i C wykonały potężne podnoszenie. – steveha

11

Python bardzo wolno radzi sobie z dużymi ilościami danych nie będących ciągami znaków. W przypadku niektórych operacji możesz zauważyć, że jest 1000 razy wolniejszy niż C/C++, więc tak, powinieneś zbadać to i wykonać niezbędne testy porównawcze przed wykonaniem algorytmów krytycznych w czasie w Pythonie.

Jednak można rozszerzyć Pythona za pomocą modułów w kodzie C/C++, dzięki czemu czasochłonne rzeczy są szybkie, a jednocześnie nadal można używać Pythona dla głównego kodu.

+4

+1 Chciałbym również, jako linia bazowa, spróbować napisać to w pythonie i w razie potrzeby zastąpić wolne części literą C. –

5

Spraw, aby działało, a następnie spraw, aby działało szybko.

+1

Nie zapomnij o środkowym kroku "Sprawdź, czy działa poprawnie". – JasCav

+0

Umieściłem "spraw, aby działało poprawnie" w mojej definicji ukończenia. Ale słyszę cię. – KevDog

1

Jeśli większość środowiska wykonawczego jest używana w bibliotekach języka C, język używany do wywoływania tych bibliotek nie jest ważny. W jakim języku napisane są twoje czasowe biblioteki?

0

Z twojego opisu prędkość nie powinna stanowić problemu (i możesz używać C, cythonu, cokolwiek chcesz, aby przyspieszyć), ale pamięć będzie. W środowiskach z maksymalną szybkością 64 Mb (gdzie system operacyjny i wszystkie powinny również pasować, prawda?), Myślę, że istnieje duże prawdopodobieństwo, że python może nie być odpowiednim narzędziem do wdrożenia docelowego.

Jeśli masz nietrywialną logikę do obsłużenia, nadal będę prototypować w Pythonie.

0

Nigdy naprawdę nie mierzyłem wydajności przykładów pyfuzzy, ale jako nowa wersja 0.1.0 można odczytać pliki FCL, jak robi to FFLL. Wystarczy opisać swój system rozmytych w tym formacie, napisać kilka wrapperów i sprawdzić wydajność obu wariantów.

Do czytania FCL z pyfuzzy trzeba runtime antlr Pythona, ale po przeczytaniu powinieneś być w stanie marynowane obiekt czytać, więc nie trzeba napowietrznej antlr na tarczy.