Cython

Cython
Cython-logo.svg
Podstawowe dane
Paradygmaty : wieloparadygmatyczne
Rok wydania: 28 lipca 2007
Deweloper: Robert Bradshaw, Stefan Behnel i wsp.
Aktualna  wersja 0.29.21   (8 lipca 2020)
Wpisywanie : mocne , statyczne , dynamiczne („ pisanie kaczych ”)
Wpływem: Python , C , C ++
System operacyjny : Linux , system typu unix
Licencja : Licencja Apache, wersja 2.0, Licencja Apache
cython.org

Cython to uniwersalny język programowania, który jest w dużej mierze kompatybilny z Pythonem . W ten sposób obsługuje różne paradygmaty programowania, takie jak programowanie obiektowe , aspektowe i funkcjonalne . Główną zaletą jest jednak tłumaczenie na język docelowy C, które umożliwia zarówno wysoką wydajność w porównaniu do standardowego interpretera Pythona, jak i bezpośrednią interakcję z zewnętrznym kodem napisanym w C, C ++ czy Fortranie .

Główne zastosowania to podłączenie zewnętrznych bibliotek do CPythona - interpretera , a także przyspieszenie kodu Pythona. Kompilator Cython może być również używany do kompilowania czystych modułów Pythona.

Wygenerowany kod nie jest samowystarczalny, ale wymaga środowiska wykonawczego kompatybilnego z CPython . Zarówno generowanie modułów binarnych („moduł rozszerzający”), które mogą być dynamicznie importładowane do interpretera języka Python za pomocą polecenia, jak i integracja konsolidatora interpretera CPython z wygenerowanym modułem, dzięki czemu plik wykonywalny Program jest tworzony ( osadzany ).

Historia rozwoju

Cython opiera się na Pyrex Greg Ewing (pierwszy opublikowany 4 kwietnia 2002). W lipcu 2007 kompilator Cython został oddzielony od Pyrex jako niezależny, otwarcie rozwijany projekt Roberta Bradshawa i Stefana Behnela. Od tego czasu podejmowano próby zachowania dużej kompatybilności obu kompilatorów, chociaż Cython stosuje znacznie bardziej rozbudowane optymalizacje i osiąga większą zgodność z kodem Pythona. Ważne różnice w stosunku do Pyrex są opisane w dokumentacji Cython.

Pochodzenie nazwy

Nazwa Cython jest słowem walizkowym dwóch podstawowych języków programowania: Python i C.

celuje

Projekt Cython postawił sobie za cel opracowanie kompilatora dla normalnego kodu Pythona, który oferuje najwyższą możliwą wydajność i szeroką integrację z kodem napisanym w C, C ++ i Fortranie poprzez dodatkowe (jawne) statyczne typowanie.

Cython jest kompilatorem optymalizującym, ale nie w zwykłym sensie kompilatora, który generuje kod binarny . Raczej tłumaczenie na kod C pozwala na pozostawienie wielu podstawowych optymalizacji i dostosowań platformy kompilatorowi C. Kompilator Cython może zatem ograniczyć się do optymalizacji wysokiego poziomu na poziomie AST .

Kod C generowany przez Cython jest w dużej mierze przenośny pod względem platform (procesor, kompilator C i system operacyjny) oraz wersji CPythona. Obecnie (wersja 0.28.5) obsługiwane są wersje CPythona 2.6 i 2.7, a także wszystkie od 3.3. Testowane platformy obejmują macOS , Windows, a przede wszystkim różne dystrybucje Linuksa z 32-bitowymi i 64-bitowymi wersjami systemu .

cechy

Połączenie Pythona i C umożliwia Cythonowi mapowanie bardzo szerokiego zakresu wymagań. Możliwe jest zarówno programowanie wysokopoziomowe z typami danych Python, konstrukcjami językowymi i automatycznym zarządzaniem pamięcią, jak również programowanie bardzo zbliżone do C z typami danych C, funkcjami C i ręcznym zarządzaniem pamięcią. Oba można dowolnie łączyć, a interakcja z czystym (nieskompilowanym) kodem Pythona jest tak samo natywnie możliwa, jak interakcja z kodem C lub C ++, co umożliwia bardzo precyzyjne podejście podczas optymalizacji kodu Cython. Dowolna część kodu może zostać napisana w czystym Pythonie, skompilowana w Cythonie, zoptymalizowana ze statycznymi typami danych lub nawet przeniesiona do C, w zależności od wymagań. W ten sposób Cython wspiera zasadę, że większość środowiska uruchomieniowego programu jest tworzona w bardzo małej części kodu źródłowego , tj. Optymalizacja niewielkiej części programu może przynieść bardzo duży wzrost wydajności, podczas gdy dla większości kodu duża szybkość programowania i niskie koszty utrzymania są ważniejsze niż najwyższa możliwa szybkość wykonania.

Język programowania osiąga integrację językową między Pythonem i C głównie poprzez typy danych. Różne konstrukcje języka Python mogą być stosowane zarówno do typów danych Python, jak i typów danych C. Przykładem jest pętla `` for '', która jest pętlą foreach w Pythonie, tj. Może działać na dowolnym iterowalnym kontenerze (np. Listach lub plikach). W Cythonie ta pętla może również przebiegać przez listy w C ++, tablice C i podtablice, a także przez sekcje wskaźnika (plasterki, np. ptr[2:8]Dla przesunięć 2–7). Ponadto istnieje automatyczna konwersja między różnymi typami danych Python i typami danych C, zarówno dla typów skalarnych (liczb), jak i dla ciągów znaków i typów danych strukturalnych (np. Typy struktur C i słowniki Pythona).

wydajność

Wiele optymalizacji, które kompilator Cython wykonuje automatycznie, prowadzi do specjalizacji generowanego kodu C. Aby to zrobić, kompilator używa jawnych deklaracji typu statycznego i (prostego) wnioskowania o typie do generowania wyspecjalizowanego kodu C dla używanych typów danych i określonych wzorców kodu. Duża część optymalizacji w kompilatorze Cython dotyczy pętli, ponieważ zwykle gromadzi się tutaj duża część całkowitego czasu wykonywania.

Struktury kontrolne (zwłaszcza pętle) są wielokrotnie szybciej tłumaczone za pomocą Cythona i kompilatora C, niż gdy są interpretowane przez CPythona. Wynika to z optymistycznych optymalizacji i wnioskowania o typie. Oznacza to, że kod Pythona skompilowany przez Cython zwykle działa szybciej niż w CPythonie 2.6.x, nawet bez jawnych deklaracji typu, chociaż względna wydajność naturalnie zależy od tego kodu. Jednak dzięki statycznej deklaracji typów danych i wynikającej z tego specjalizacji kodu C zwykle można osiągnąć wielokrotne przyspieszenie. Zwłaszcza w przypadku obliczeń matematycznych poprawa czasu działania jest często od stu do tysiąca. Dla porównania, typowe przyspieszenie przez kompilator Python JIT Psyco wynosi około czterysta do stu razy , a PyPy w wybranych przypadkach do dwunastu razy.

Kod generowany przez Cython dla funkcji jest zoptymalizowany pod kątem szybkiego rozpakowywania i konwersji parametrów wywołań. Dlatego wywoływanie kodu natywnego w Pythonie za pośrednictwem opakowania Cython jest generalnie szybsze niż w przypadku innych implementacji opakowań dla Pythona.

obszary zastosowań

Najważniejsze obszary zastosowań Cythona to podłączenie zewnętrznych bibliotek do interpretera CPythona, a także przyspieszenie kodu Pythona, szczególnie w obliczeniach matematycznych i algorytmach intensywnie obliczeniowych .

Na przykład system algebry komputerowej SageMath jest w dużej mierze oparty na kodzie Cythona. Służy do implementacji algorytmów matematycznych, a także do łączenia zewnętrznych kodów w językach C, C ++ i Fortran. Cython obsługuje również bardzo wydajną interakcję z NumPy - macierzami , które na podstawie tych obliczeń są znacznie uproszczone.

Wydajna biblioteka XML lxml jest w dużej mierze zaimplementowana w Cythonie. Zewnętrzne biblioteki C libxml2 i libxslt są dowiązane do interpretera Pythona.

Innym przykładem ze środowiska programistycznego Cython Core jest biblioteka MPI mpi4py. Łączy różne implementacje MPI z CPythonem.

Indeks pakietów Pythona zawiera krótką listę innych bibliotek zaimplementowanych w Cythonie.

Powiązane i podobne projekty

  • Pyrex - poprzednik Cythona
  • Unloaden Swallow - zoptymalizowane środowisko wykonawcze CPython; na podstawie LLVM
  • PyPy - framework kompilatora JIT i środowisko uruchomieniowe Python, które jest samo napisane w dialekcie Pythona (RPython)
  • Psyco - wyspecjalizowany kompilator JIT i optymalizator kodu dla środowiska wykonawczego CPython
  • Shed Skin - statycznie typowany język programowania podobny do Pythona, skompilowany zgodnie z C ++

Indywidualne dowody

  1. Wersja 0.29.21 . 8 lipca 2020 (dostęp 9 lipca 2020).
  2. github.com . (dostęp 2 lutego 2020).
  3. ^ Cython: C-Extensions dla Pythona . (ostatnia wizyta 8 lipca 2018).
  4. oryginalne wersje poprzednika Pyrex
  5. Kompatybilność z Pythona 2 jest deklarowany cel dla przyszłego Cython wersji 1.0 ( pamiątka z oryginałem od 10 sierpnia 2011 roku w Internet Archive ) Info: archiwum Link został automatycznie wstawiony i jeszcze nie sprawdzone. Sprawdź oryginalny i archiwalny link zgodnie z instrukcjami, a następnie usuń to powiadomienie. @ 1@ 2Szablon: Webachiv / IABot / wiki.cython.org
  6. slices on docs.python.org, dostęp 2 sierpnia 2018 r
  7. gmane.comp.python.cython.devel - porównanie pybench Cython i CPython 2.6.2
  8. gmane.comp.python.cython.devel - Przekazywanie wskaźnika z poziomu Pythona ( pamiątka z oryginałem od 14 lutego 2017 roku w Internet Archive ) Info: archiwum Link został automatycznie wstawiony i jeszcze nie sprawdzone. Sprawdź oryginalny i archiwalny link zgodnie z instrukcjami, a następnie usuń to powiadomienie. @ 1@ 2Szablon: Webachiv / IABot / thread.gmane.org
  9. ^ Psyco - Wprowadzenie
  10. Szybkość PyPy 1.4 w porównaniu z CPythonem 2.6.2 z / bez Psyco
  11. C ++ wrapper odniesienia dla różnych generatorów Pythona otoki (bez Cython) ( pamiątka z oryginałem od 4 kwietnia 2015 roku w Internet Archive ) Info: archiwum Link został automatycznie wstawiony i jeszcze nie sprawdzone. Sprawdź oryginalny i archiwalny link zgodnie z instrukcjami, a następnie usuń to powiadomienie. @ 1@ 2Szablon: Webachiv / IABot / telecom.inescporto.pt
  12. Testy C ++ wrapperów dla Cython, Boost.Python i PyBindGen
  13. Lista pakietów Pythona zaimplementowanych w Cythonie na PyPI