שיאון שחוריMilOSS-il 2012. מוטיבציה  python זה קל ו C זה מהיר. למה לא לשלב?  יש כבר קוד קיים ב C. אנחנו רוצים להשתמש בו, ולבסס מעליו קוד חדש ב python.

Slides:



Advertisements
Similar presentations
Cython [toc] level = 1 title = Cython # end config.
Advertisements

Processes and threads. תהליכים ותתי תהליכים תהליכים –כל תוכנית שרצה היא תהליך (process) –ניתן להתפצל מתהליך אחד למספר תהליכים, בעזרת הפקודה fork(). הרבה.
ממיבחניםC שאלות ++.
תוכנה 1 סמסטר א ' תשע " ב תרגול מס ' 7 * מנשקים, דיאגרמות וביטים * לא בהכרח בסדר הזה.
מבוא למדעי המחשב לתעשייה וניהול
בתרגול הקודם הורשה: –ניתן להרחיב רק מחלקה אחת –כל מה שלא private – עובר בהורשה –המילה השמורה super –יצירת היררכיה –Object היא שורש ההיררכיה –דריסה אופרטור.
מבוא למדעי המחשב לתעשייה וניהול דוגמאות ותרגול נוסף במערך חד ממדי הרצאה 12.
1 תוכנה 1 תרגול 14 – סיכום. 2 קצת על מנשקים מנשק יכול להרחיב יותר ממנשק אחד שירותים במנשק הם תמיד מופשטים וציבוריים public interface MyInterface { public.
©Silberschatz, Korth and Sudarshan4.1Database System Concepts סכימה לדוגמא.
טבלאות סמלים נכתב ע"י אלכס קוגן סמסטר חורף, תשס"ח.
Map-Reduce Input: a collection of scientific articles on different topics, each marked with a field of science –Mathematics, Computer Science, Biology,
Pointers הרצאה קריטית. השאלות הפתוחות מה זה ה- & שמופיע ב scanf מדוע כשמעבירים מחרוזת ל scanf אין צורך ב & האם ניתן להכריז על מערך שגדלו אינו ידוע בתחילת.
לומדה לשימוש ב Google Scholar en&tab=ws.
1 Formal Specifications for Complex Systems (236368) Tutorial #2 Z introduction and notation (contd.); Birthday book example (Chapter 1 in the book); Z.
הדרכה בשימוש בקטלוג הספרייה מפגש מס ' 2 תשס " ח. מטרת ההדרכה  איתור חומר מתוך הסילבוס  איתור חומר בנושא מבוקש.
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב'
RSS. על מה נדבר מה זה RSS ולמה צריך את זה היסטוריה ותקנים איך כותבים איך קוראים.
ספר סקיצות ספר סקיצות קלאסי עם יכולות ממוחשבות. ספר סקיצות רגיל  יתרונות : נוח לנשיאה, מהיר ונוח לעבודה, עמיד.  חסרונות : הכול ידני, קשה לקבל דיוקים.
Map-Reduce Input: a collection of scientific articles on different topics, each marked with a field of science –Mathematics, Computer Science, Biology,
מבוא למדעי המחשב © אריק פרידמן 1 מצביעים כמערכים דוגמה.
תרגול חזרה. מבנה האובייקט תאר את מבנה האובייקט כולל מבנה טבלאות הפונקציות הוירטואליות עבור התכנית הבאה struct A { int x; virtual void a() {}; }; struct.
ממשק המשתמש שימושיות או בעצם תכליפאניות?. ISO9241 Web usability is the extent to which a web site enables users, in a given context of use, to achieve.
עיבוד תמונות ואותות במחשב אלכסנדר ברנגולץ דואר אלקטרוני : שיטות קידוד שיטות קידוד אורך מלת קוד ואנטרופיה אורך מלת קוד ואנטרופיה קידוד.
Formal Specifications for Complex Systems (236368) Tutorial #6 appendix Statecharts vs. Raphsody 7 (theory vs. practice)
תכנות תרגול 6 שבוע : תרגיל שורש של מספר מחושב לפי הסדרה הבאה : root 0 = 1 root n = root n-1 + a / root n-1 2 כאשר האיבר ה n של הסדרה הוא קירוב.
1 Formal Specifications for Complex Systems (236368) Tutorial #1 Course site : T.A. :Emilia Katz.
מערכות הפעלה ( אביב 2009) חגית עטיה ©1 מערכת קבצים log-structured  ה log הוא העותק היחיד של הנתונים  כאשר משנים בלוק (data, header) פשוט כותבים את הבלוק.
תהליכים  מהו תהליך ?  מבני הנתונים לניהול תהליכים.  החלפת הקשר.  ניהול תהליכים ע " י מערכת ההפעלה.
עיבוד תמונות ואותות בעזרת מחשב תרגול מס' 1: Welcome to Matlab!
רישום חומרי למידה והסטנדרט הישראלי: ISRACORE יהודית בר אילן, אוניברסיטת בר-אילן אלי שמואלי, מיט"ל.
Data Structures, CS, TAU, Perfect Hashing 1 Perfect Hashing בעיה : נתונה קבוצה S של n מפתחות מתחום U השוואה ל - Hash : * טבלה קבועה (Hash רגיל - דינאמי.
1 Data Structures, CS, TAU, Perfect Hashing בעיה: נתונה קבוצה S של n מפתחות מתחום U השוואה ל- Hash : * טבלה קבועה (Hash רגיל - דינאמי) * רוצים זמן קבוע.
עקרון ההכלה וההדחה.
מערכות הפעלה ( אביב 2006) חגית עטיה © 1 סיכום הקורס.
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב' Templates תבניות.
מערכות הפעלה ( אביב 2004) חגית עטיה © 1 תהליכים  מהו תהליך ?  מבני הנתונים לניהול תהליכים.  החלפת הקשר.  ניהול תהליכים ע " י מערכת ההפעלה.
Unicode and the Glocalization of the Internet: How “ View>Encoding> Hebrew (Visual) ” is Becoming a Thing of the Past הרצאה לכנס דוקטורנטים חוקרי אינטרנט,
A. Frank File Organization Hardware Size Parameters.
Safari On-line books. מה זה ספארי ספארי זו ספריה וירטואלית בנושא מחשבים היא כוללת יותר מ כותרים כל הספרים הם בטקסט מלא ניתן לחפש ספר בנושא מסוים.
Points on a perimeter (Convex Hull) קורס – מבוא לעבוד מקבילי מבצעים – אריאל פנדלר יאיר ברעם.
(C) סיון טל גילוי מידע וזיהוי תבניות תרגול מס. 9 גילוי מידע וזיהוי תבניות תרגול מס. 9 דחיסת נתונים מהו קידוד תכונות של קידודים אי - שוויון קרפט.
1 Formal Specifications for Complex Systems (236368) Tutorial #3 Z introduction and notation (contd.); Birthday book example (Chapter 1 in the book)
אביב תשס " ה JCT תיכון תוכנה ד " ר ר ' גלנט / י ' לויאןכל הזכויות שמורות 1 פרק 7 ISP דוגמא נוספת.
תכנות תרגול 1 שבוע : צור קשר מתרגל – ליעם רודיטי, ביה " ס למדעי המחשב. מתרגל – ליעם רודיטי, ביה " ס למדעי המחשב. דואר אלקטרוני :
CCN CCN Central Control Network Part A presentation Winter & Spring 2002/03 Student : Kormas Tal Guide : Gerber Alex.
מטא-מודלים Metamodels. מטא-מודל - דגשים לפתרון לקרוא את הכל – זה ארוך אבל הכל נמצא בפנים ! להסתכל על התרשימים הויזואליים ולראות מה מזהים. לקשר בין התמונה.
הגדרת משתנים יום שישי 18 ספטמבר 2015 יום שישי 18 ספטמבר 2015 יום שישי 18 ספטמבר 2015 יום שישי 18 ספטמבר 2015 יום שישי 18 ספטמבר 2015 יום שישי 18 ספטמבר.
מבוא למדעי המחשב לתעשייה וניהול הרצאה 7. סברוטינות subroutines.
Costs and Filters Dr. Avi Rosenfeld Department of Industrial Engineering Jerusalem College of Technology
Emilia Katz, Shahar Dag 1 Formal Specifications for Complex Systems (236368) Tutorial #13 Algebraic Specification and Larch.
Visual Studio Team System Visual Studio Team System הילה להב רייס מנהלת תחום Life Cycle Management מנהלת תחום Life Cycle
1 המרכז להוראת המדעים © האוניברסיטה העברית בירושלים פולימורפיזם מתקדם ממשקים בג ' אווה 1.
מבוא למדעי המחשב לתעשייה וניהול הרצאה 6. מפעל השעווה – לולאות  עד עכשיו  טיפלנו בייצור נרות מסוג אחד, במחיר אחיד  למדנו להתמודד עם טיפול במקרים שונים.
האוניברסיטה העברית בירושלים
מספרים אקראיים ניתן לייצר מספרים אקראיים ע"י הפונקציה int rand(void);
Object Oriented Programming
Object Oriented Programming
SQL בסיסי – הגדרה אינדוקטיבית
עבודה עם נתונים באמצעות ADO.NET
משימת חקר מכוון ללמידה משמעותית
Asynchronous programming
מבוא לתכנות בWINDOWS ב#C
מערכים של מצביעים הקצאה דינאמית
Shell Scripts בסביבת UNIX
תוכנה 1 תרגול 13 – סיכום.
תוכנה 1 תרגול 13 – סיכום.
Computer Programming תרגול 3 Summer 2016
Engineering Programming A
פולימורפיזם מתקדם ממשקים בC# עריכה ועיצוב: קרן הרדי
הודעות ריענון מהיר והרחבות - Shift Register Feedback Node המשך
Presentation transcript:

שיאון שחוריMilOSS-il 2012

מוטיבציה  python זה קל ו C זה מהיר. למה לא לשלב?  יש כבר קוד קיים ב C. אנחנו רוצים להשתמש בו, ולבסס מעליו קוד חדש ב python  מסקנה: צריך ממשק (דו כיווני) בין python ל C  פתרונות ידועים (לי): שימוש בתהליכים נפרדים, ctypes, C/Python API או cython

פתרונות ( תהליכים )  תהליכים שונים אחד כתוב ב C, השני ב python העברת מידע באמצעות IO (socket, קבצים וכו')  מה קיבלנו? לא צריך להכיר טכנולוגיה חדשה צריך לנהל תהליך C מלא  לא יעיל  מסורבל  צריך להגדיר ממשקים בין התהליכים 

פתרונות (ctypes)  יצירת dll ושימוש ב ctypes כתיבת dynamic library ב C טעינה של הספרייה באמצעות ctypes קריאה לפונקציות שנכתבו ב C

פתרונות (ctypes)  מה קיבלנו? תהליך בודד יעיל קל הגדרות כפולות (ולאו דווקא תואמות)  קישוריות חד כיוונית (אי אפשר לקרוא לקוד python מתוך C בקלות) 

פתרונות (C/Python API)  שימוש ב C/Python API קידוד קוד ב C תוך קריאה לפונקציות מתוך Python.h בניית extension באמצעות distutils שימוש מתוך פייתון באמצעות import  מה קיבלנו? תהליך בודד יעיל הגדרת טיפוסים בודדת קישוריות דו כיווניות קידוד מסורבל (למשל, שימוש באובייקטים פייתונים מתוך C) 

פתרונות (Cython)  שימוש ב Cython מבוסס pyrex כתיבת קבצי.pyx: קבצי python (פחות או יותר) עם פקודות מיוחדות בניית extension באמצעות distutils שימוש מתוך פייתון באמצעות import  מה קיבלנו? תהליך בודד יעיל הגדרת טיפוסים בודדת (כמעט  ) קישוריות דו כיווניות קידוד נוח

Cython בסיסי #include inline int my_func(int x) { printf(“my func %d\n”, x); return 0; } cdef extern from “bla.h”: int my_func(int) def pymy_func(x): return my_func(x) import bla print bla.pymy_func(10) bla.h bla.pyx main.py

Distutils setup.py from distutils.core import setup from distutils.extension import Extension from Cython.Distutils import build_ext setup(cmdclass={'build_ext': build_ext}, ext_modules=[Extension(“bla", ['bla.pyx'])]) setup.py $ python setup.py build_ext --inplace running build_ext cythoning bla.pyx to bla.c building 'bla' extension gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall - Wstrict-prototypes -fPIC -I/usr/include/python2.6 -c bla.c -o build/temp.linux-i /bla.o gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions build/temp.linux- i /bla.o -o /mnt/filer_home/users/t_sion/bla.so בנייה

דוגמה : קידוד פשוט  הבעיה: יש מערך גדול של בתים, ורוצים לקודד אותו עם הקוד הפשוט הבא: כל בית מוחלף בשני בתים: הבית המקורי וה not שלו

מימוש פייתוני import array lookup = {} for i in range(256): lookup[chr(i)] = chr(i) + chr(i ^ 0xFF) def encode(arr): out = array.array('c', '\x00' * len(arr) * 2) for i in xrange(len(arr)): data = lookup[arr[i]] out[2*i] = data[0] out[2*i + 1] = data[1] return out pyencode.py

מימוש פייתוני - המשך In [10]: s = array.array('c', '\x01\xf3\x34\x45' * (10 ** 6)) In [11]: import pyencode In [12]: %timeit -n 3 pyencode.encode(s) 3 loops, best of 3: 2.84 s per loop

מימוש cython פשוט In [13]: import cyencode_simple In [14]: %timeit -n 3 cyencode_simple.encode(s) 3 loops, best of 3: 1.62 s per loop  אותו קוד, רק מקומפל עם cython למודול cyencode_simple

מימוש cython מתקדם import array cdef unsigned short lookup[256] cdef unsigned char *_ptr for i in range(256): _ptr = (&lookup[i]) _ptr[0] = i _ptr[1] = (i ^ 0xFF) def encode(arr): cdef int i cdef unsigned char *in_ptr, *out_ptr, *p in_ptr = (arr.buffer_info()[0]) out = array.array('c', '\x00' * len(arr) * 2) out_ptr = (out.buffer_info()[0]) for i in range(len(arr)): p = (&lookup[ in_ptr[i]]) out_ptr[2*i] = p[0] out_ptr[2*i + 1] = p[1] return out cyencode.py

מימוש cython מתקדם - המשך In [15]: import cyencode In [16]: %timeit -n 3 cyencode.encode(s) 3 loops, best of 3: 26.8 ms per loop

מימוש cython מתקדם – הצצה לקוד C for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_4; __pyx_t_6+=1) { __pyx_v_i = __pyx_t_6; /* "cyencode.pyx":17 * p = (&lookup[ in_ptr[i]]) # <<<<<<< */ __pyx_v_p = ((unsigned char *)(&(__pyx_v_8cyencode_lookup[ ((int)(__pyx_v_in_ptr[__pyx_v_i]))]))); /* "cyencode.pyx":18 * out_ptr[2*i] = p[0] # <<<<<<< */ (__pyx_v_out_ptr[(2 * __pyx_v_i)]) = (__pyx_v_p[0]); /* "cyencode.pyx":19 * out_ptr[2*i + 1] = p[1] # <<<<<<< */ (__pyx_v_out_ptr[((2 * __pyx_v_i) + 1)]) = (__pyx_v_p[1]); } cyencode.c

Pitfalls  GIL  Reference counting  טיפול בשגיאות ב cdef functions

פיצ ' רים נוספים  def,cdef,cpdef  namespaces – איך לתת שמות זהים בפייתון וב C  קבצי.pxd  cinit ו dealloc  אינטגרציה עם numpy

מידע נוסף  תיעוד cython: כולל tutorial טוב  במייל שלי:

נספח : דוגמה ל cytpes  נשתמש ב ספריה librt  נייצא את הפונרציה clock_gettime לפייתון

נספח : דוגמה ל ctypes RT_DLL = ctypes.cdll.LoadLibrary(‘/lib/librt.so.1’) # taken from bits/time.h CLOCK_MONOTONIC = 1 class timespec(ctypes.Structure): _fields_ = [('tv_sec', ctypes.c_long), ('tv_nsec', ctypes.c_long)] def gettime(): time_struct = timespec() res = RT_DLL.clock_gettime(CLOCK_MONOTONIC, ctypes.addressof(time_struct)) if res != 0: raise RuntimeError("clock_gettime failed (err = %d)" % (ctypes.get_errno(),)) return time_struct.tv_sec + time_struct.tv_nsec * 1e-9