מה זה סיטון? פיתון במהירות C

לפיתון יש מוניטין של היותה אחת משפות התכנות הנוחות ביותר, המאובזרות ביותר ושימושיות. מהירות ביצוע? לא כל כך.

היכנס לסייתון. שפת הסיתון היא קבוצה-על של פיתון שמתאספת ל- C, ומניבה תוספי ביצועים שיכולים לנוע בין כמה אחוזים למספר סדרי גודל, תלוי במשימה העומדת על הפרק. בעבודה המאוגדת בסוגי האובייקטים המקוריים של פייתון, המהירות לא יהיו גדולות. אך עבור פעולות מספריות או כל פעולה שאינה כוללת את הפנימיות של פיתון עצמו, הרווחים יכולים להיות גדולים. 

באמצעות Cython, אתה יכול לעקוף הרבה מהמגבלות המקוריות של Python או להתעלות עליהן לחלוטין - מבלי שתצטרך לוותר על הקלות והנוחות של Python. במאמר זה נעבור בין המושגים הבסיסיים שמאחורי Cython וניצור יישום פשוט של Python המשתמש ב- Cython כדי להאיץ את אחת מתפקידיו.

סרטון קשור: שימוש בסיתון כדי להאיץ את פייתון

הידור פיתון ל- C

קוד פייתון יכול לבצע שיחות ישירות למודולי C. מודולי C אלה יכולים להיות ספריות C גנריות או ספריות שנבנו במיוחד לעבודה עם Python. Cython מייצר את הסוג השני של המודול: ספריות C המדברות עם הפנימיות של Python, וניתן לשלב אותן עם קוד Python קיים.

קוד Cython נראה הרבה כמו קוד Python, לפי עיצוב. אם אתה מאכיל את מהדר הסיתון בתוכנית פייתון (Python 2.x ו- Python 3.x נתמכים שניהם), Cython יקבל אותה כמו שהיא, אך אף אחת מהתאוצות המקוריות של Cython לא תיכנס לתמונה. אך אם אתה מקשט את קוד הפיתון בהערות סוג בתחביר המיוחד של סייתה, סייתון יוכל להחליף מקבילות C מהירות לאובייקטים פייתוניים איטיים.

שים לב שהגישה של Cython היא  מצטברת . כלומר, מפתח יכול להתחיל  ביישום פייתון קיים , ולהאיץ אותו על ידי ביצוע שינויים נקודתיים בקוד, במקום לשכתב את היישום כולו מהיסוד.

גישה זו משתלבת בדרך כלל עם אופי בעיות ביצועי התוכנה. ברוב התוכניות, הרוב המכריע של הקוד עתיר המעבד מרוכז בכמה נקודות חמות - גרסה של עקרון פארטו, המכונה גם הכלל "80/20". לפיכך, רוב הקוד ביישום Python לא צריך להיות מותאם לביצועים, אלא רק כמה חלקים קריטיים. אתה יכול לתרגם באופן הדרגתי את הנקודות החמות לסיתון, וכך להשיג את רווחי הביצועים שאתה צריך במקום שהכי חשוב. שאר התוכנית יכולה להישאר בפייתון לנוחיות המפתחים.

כיצד להשתמש בסיתון

שקול את הקוד הבא, שנלקח מתיעוד של Cython:

def f (x):

    החזר x ** 2-x

def integrate_f (a, b, N):

    s = 0

    dx = (ba) / N

    עבור אני בטווח (N):

        s + = f (a + i * dx)

    החזר s * dx

זו דוגמה לצעצועים, יישום לא מאוד יעיל של פונקציה אינטגרלית. כקוד פייתון טהור, זה איטי, מכיוון שפייתון חייב להמיר קדימה ואחורה בין סוגים מספריים מקוריים למכונה לבין סוגי אובייקטים פנימיים משלה.

שקול כעת את גרסת הסיתון של אותו קוד, כאשר התוספות של סייתון מודגשות:

 cdef כפול f (כפול x):

    החזר x ** 2-x

def integrate_f (כפול a, כפול b, int N):

    cdef int i

    cdef כפול s, x, dx

    s = 0

    dx = (ba) / N

    עבור אני בטווח (N):

        s + = f (a + i * dx)

    החזר s * dx

אם אנחנו במפורש להכריז על סוגי המשתנים, הן עבור פרמטרים הפונקציה והמשתנים משמש בגוף של הפונקציה ( double, int, וכו '), Cython תתרגם את כל זה לתוך ג אנחנו יכולים גם להשתמש cdefמילות מפתח כדי להגדיר פונקציות שאינן מיושם בעיקר ב- C למהירות נוספת, אם כי פונקציות אלה יכולות להיקרא רק על ידי פונקציות Cython אחרות ולא על ידי סקריפטים של Python. (בדוגמה שלעיל, integrate_fניתן להתקשר רק על ידי סקריפט פייתון אחר.)

שים לב כמה מעט הקוד בפועל שלנו  השתנה. כל מה שעשינו הוא להוסיף הצהרות סוג לקוד הקיים כדי להשיג שיפור ביצועים משמעותי.

יתרונות קיתון

מלבד היכולת להאיץ את הקוד שכבר כתבת, Cython מעניק עוד כמה יתרונות:

העבודה עם ספריות C חיצוניות יכולה להיות מהירה יותר

חבילות פייתון כמו NumPy עוטפות ספריות C בממשקי פייתון כדי להקל עליהן לעבוד. עם זאת, מעבר קדימה ואחורה בין פייתון ו- C דרך העטיפות הללו יכול להאט את העניינים. Cython מאפשר לך לדבר ישירות עם הספריות הבסיסיות, בלי Python בדרך. (ספריות C ++ נתמכות גם כן.)

אתה יכול להשתמש בניהול זיכרון C וגם בפייתון

אם אתה משתמש באובייקטים של פייתון, הם מנוהלים בזיכרון ונאספים אשפה כמו בפייתון רגיל. אך אם ברצונך ליצור ולנהל מבנים משלך ברמת C, ולהשתמש malloc/ freeלעבוד איתם, תוכל לעשות זאת. רק זכרו לנקות אחרי עצמכם.

אתה יכול לבחור בטיחות או מהירות לפי הצורך 

Cython מבצע אוטומטית בדיקות זמן ריצה לגבי בעיות נפוצות שצצות ב- C, כגון גישה מחוץ לתחום במערך, באמצעות מעצבים והוראות מהדר (למשל, @boundscheck(False)). כתוצאה מכך, קוד C שנוצר על ידי Cython הוא הרבה יותר בטוח כברירת מחדל מאשר קוד C מגולגל ביד, אם כי במחיר של ביצועים גולמיים.

אם אתה בטוח שלא תזדקק לבדיקות אלה בזמן הריצה, תוכל להשבית אותן לצורך רווחי מהירות נוספים, על פני מודול שלם או רק על פונקציות נבחרות.

Cython גם מאפשר לך לגשת באופן מקורי למבני Python המשתמשים בפרוטוקול המאגר לגישה ישירה לנתונים המאוחסנים בזיכרון (ללא העתקת ביניים). תצוגות הזיכרון של סיטון מאפשרות לך לעבוד עם אותם מבנים במהירות גבוהה ועם רמת הבטיחות המתאימה למשימה. לדוגמה, ניתן לקרוא את הנתונים הגולמיים העומדים בבסיס מחרוזת פייתון באופן זה (מהיר) מבלי לעבור את זמן הריצה של פייתון (איטי).

קוד Cython C יכול להפיק תועלת משחרור ה- GIL

נעילת המתורגמן הגלובלית של Python, או GIL, מסנכרנת פתילים בתוך המתורגמן, מגנה על הגישה לאובייקטים של Python ומנהלת מחלוקת על משאבים. עם זאת, ביקורת נרחבת על ה- GIL היוותה אבן נגף לפייתון בעל ביצועים טובים יותר, במיוחד במערכות מרובות ליבות.

אם יש לך קטע קוד שלא מתייחס לאובייקטים של Python ומבצע פעולה ארוכת טווח, אתה יכול לסמן אותו  with nogil:בהנחיה כדי לאפשר לו לרוץ ללא GIL. זה משחרר את מתורגמן הפייתון לעשות דברים אחרים ומאפשר לקוד הסיתון להשתמש במספר ליבות (עם עבודה נוספת).

Cython יכול להשתמש בתחביר רמז מסוג Python 

לפייתון יש תחביר מרמז על סוג המשמש בעיקר על ידי סניפים ובודקי קוד, ולא מתורגמן ה- CPython. ל- Cython תחביר מותאם אישית משלו לקישוטי קוד, אך עם התיקונים האחרונים של Cython תוכלו להשתמש בתחביר של רמזים מסוג Python כדי לספק רמזים בסיסיים גם לסיתון. 

ניתן להשתמש ב- Cython כדי לטשטש קוד פיתון רגיש

קל לפזר ולבדוק את המודולים של פייתון, אך לא בינאריות מהודרות. בעת הפצת יישום Python למשתמשי קצה, אם ברצונך להגן על חלק מהמודולים שלו מפני חטטנות מזדמנת, תוכל לעשות זאת על ידי הידורם עם Cython. שים לב, עם זאת, זוהי תופעת לוואי של יכולותיו של Cython, לא אחת מתפקידיה המיועדים.

מגבלות של סיטון

יש לזכור שסייתון אינו מטה קסמים. זה לא הופך אוטומטית כל מופע של קוד פייתון פוקי לקוד C רוחש במהירות. כדי להפיק את המרב מסיתון, עליך להשתמש בו בחוכמה - ולהבין את מגבלותיו:

מהירות מועטה עבור קוד פייתון קונבנציונאלי

כשסייתון נתקל בקוד פייתון הוא לא יכול לתרגם לחלוטין ל- C, הוא הופך את הקוד הזה לסדרה של שיחות C לחלקים הפנימיים של פיתון. זה מסתכם בהוצאת המתורגמן של פייתון מלולאת הביצוע, מה שמקנה לקוד מהירות צנועה של 15 עד 20 אחוז כברירת מחדל. שים לב שזהו התרחיש הטוב ביותר; במצבים מסוימים, ייתכן שלא תראה שום שיפור בביצועים, ואפילו לא ירידה בביצועים.

מהירות מועטה עבור מבני נתונים מקוריים של פייתון

פייתון מספק שלל מבני נתונים - מחרוזות, רשימות, כפולות, מילונים וכו '. הם מאוד נוחים למפתחים, והם מגיעים עם ניהול זיכרון אוטומטי משלהם. אבל הם איטיים יותר מג 'טהור.

Cython מאפשר לך להמשיך להשתמש בכל מבני הנתונים של Python, אם כי ללא מהירות רבה. זאת, שוב מכיוון שסייתון פשוט מכנה את ממשקי ה- API של C בזמן הריצה של פייתון היוצרים ומטפלים באובייקטים אלה. כך שמבני נתונים של פייתון מתנהגים כמו קוד פייתון המותאם לסיתון באופן כללי: לפעמים אתה מקבל דחיפה, אבל רק מעט. לקבלת התוצאות הטובות ביותר, השתמש במשתנים ומבנים C. החדשות הטובות הן שסייתון מקל על העבודה איתם.

קוד הסיטון פועל הכי מהר כאשר "טהור C"

אם יש לך פונקציה ב- C שכותרתה cdefמילת המפתח, עם כל המשתנים שלה וקריאות פונקציות מוטבעות לדברים אחרים שהם טהורים C, היא תפעל כמה ש- C יכול ללכת. אך אם פונקציה זו מתייחסת לכל קוד מקורי של פייתון, כמו מבנה נתונים של פייתון או קריאה לממשק API פנימי של פייתון, קריאה זו תהיה צוואר בקבוק ביצועים.

למרבה המזל, Cython מספק דרך לאתר את צווארי הבקבוק האלה: דוח קוד מקור שמראה במבט אחד אילו חלקים באפליקציית Cython שלך הם C טהור ואילו חלקים מתקשרים עם Python. ככל שהאפליקציה ממוטבת טוב יותר, כך תהיה פחות אינטראקציה עם פייתון.

Cython NumPy 

Cython משפר את השימוש בספריות פריסת מספרים של צד שלישי כמו NumPy. מכיוון שקוד הסיטון מתאסף ל- C, הוא יכול לקיים אינטראקציה עם הספריות האלה ישירות ולהוציא את צווארי הבקבוק של פייתון מהלולאה.

אבל NumPy, במיוחד, עובדת היטב עם Cython. ל- Cython תמיכה מקורית עבור קונסטרוקציות ספציפיות ב- NumPy ומספקת גישה מהירה למערכי NumPy. ואותו תחביר NumPy מוכר שהיית משתמש בתסריט פייתון קונבנציונאלי ניתן להשתמש ב- Cython כפי שהוא.

עם זאת, אם ברצונך ליצור את הקישורים הקרובים ביותר האפשריים בין Cython ו- NumPy, עליך לקשט את הקוד עוד בתחביר המותאם אישית של Cython. cimportהאמירה, למשל, מאפשרת קוד Cython לראות מבני C-רמה בספריות בזמן ההידור עבור האיגודים המהירים ביותר האפשריים.

מכיוון ש- NumPy נמצא בשימוש כה נרחב, Cython תומך ב- NumPy "מחוץ לקופסה". אם התקנת את NumPy, תוכל פשוט לציין  cimport numpy בקוד שלך, ואז להוסיף קישוט נוסף כדי להשתמש בפונקציות החשופות. 

פרופיל וביצועים של סיטונים

אתה משיג את הביצועים הטובים ביותר מכל פיסת קוד על ידי פרופיל זה ולראות ממקור ראשון היכן נמצאים צווארי הבקבוק. Cython מספק ווים עבור מודול ה- cProfile של Python, כך שתוכלו להשתמש בכלי הפרופיל של Python עצמו, כמו cProfile, כדי לראות כיצד מבצע קוד הסיטון שלכם. 

זה עוזר לזכור בכל המקרים שסייתון אינו קסם - שיטות ביצועים הגיוניות בעולם האמיתי עדיין חלות. ככל שתעבור הלוך ושוב בין פייתון לסיתון פחות, האפליקציה שלך תפעל מהר יותר.

לדוגמא, אם יש לך אוסף של אובייקטים שברצונך לעבד בסייתון, אל תחזור עליו בפייתון והפעל פונקציית סיתון בכל שלב. העבירו את כל האוסף למודול הסיתון שלכם ואיתרו שם. טכניקה זו משמשת לעיתים קרובות בספריות המנהלות נתונים, כך שזה מודל טוב לחיקוי בקוד שלך.

אנו משתמשים ב- Python מכיוון שהוא מספק נוחות למתכנתים ומאפשר פיתוח מהיר. לפעמים אותה פרודוקטיביות של מתכנת גובה מחיר של ביצועים. עם Cython, רק קצת מאמץ נוסף יכול להעניק לכם את המיטב משני העולמות.

קרא עוד על Python

  • מה זה פיתון? תכנות עוצמתי ואינטואיטיבי
  • מה זה PyPy? פיתון מהיר יותר ללא כאבים
  • מה זה סיטון? פיתון במהירות C
  • מדריך Cython: כיצד להאיץ את Python
  • כיצד להתקין את פייתון בדרך החכמה
  • התכונות החדשות הטובות ביותר ב- Python 3.8
  • ניהול פרויקטים טוב יותר של פייתון עם שירה
  • Virtualenv ו- venv: הסברים על סביבות וירטואליות של Python
  • Python virtualenv ו- venv do's and donts
  • הסבר על השחלת פיתון ותהליכי משנה
  • כיצד להשתמש בבאגים של פייתון
  • כיצד להשתמש ב- timeit לפרופיל קוד פייתון
  • כיצד להשתמש ב- cProfile לפרופיל קוד פייתון
  • התחל לעבוד עם אסינכרון בפייתון
  • כיצד להשתמש ב- asyncio בפייתון
  • כיצד להמיר את פייתון ל- JavaScript (ובחזרה)
  • Python 2 EOL: איך לשרוד את סוף Python 2
  • 12 פיתונים לכל צורך בתכנות
  • 24 ספריות פייתון לכל מפתח פיתון
  • 7 מזהי פייתון מתוקים שאולי פספסתם
  • 3 ליקויים גדולים בפייתון - והפתרונות שלהם
  • 13 מסגרות אינטרנט של פייתון בהשוואה
  • 4 מסגרות מבחן פייתון כדי למחוץ את החרקים שלך
  • 6 תכונות פייתון חדשות נהדרות שאתה לא רוצה לפספס
  • 5 הפצות פיתון לשליטה בלמידת מכונה
  • 8 ספריות פיתון נהדרות לעיבוד שפות טבעיות