Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π·Ρ‹ΠΊ программирования PythonΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 53

Автор Π ΠΎΠΌΠ°Π½ Π‘ΡƒΠ·ΠΈ

Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Python ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ встроСн Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° C с использованиСм C API. Π­Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ всСго дСмонстрируСт ΡƒΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

/* File : demo.c */

/* ΠŸΡ€ΠΈΠΌΠ΅Ρ€ встраивания ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° Python Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ */

#include "Python.h"


main(int argc, char **argv) {

 /* ΠŸΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ argv[0] ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Ρƒ Python */

 Py_SetProgramName(argv[0]);


 /* Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° */

 Py_Initialize();


 /* ... */


 /* Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² Python (ΠΊΠ°ΠΊ Π±Ρ‹ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ __main__) */

 PyRun_SimpleString("import time\n");

 PyRun_SimpleString("print time.localtime(time.time())\n");


 /* ... */


 /* Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° */

 Py_Finalize();

}

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ этого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ компилятора gcc ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π°ΠΊ:

ver="2.3"

gcc–fpic demo.c–DHAVE_CONFIG_H–lm–lpython${ver} \

 -lpthread–lutil–ldl \

 -I/usr/local/include/python${ver} \

 -L/usr/local/lib/python${ver}/config \

 -Wl, -E \

 -o demo

Π—Π΄Π΅ΡΡŒ слСдуСт ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹:

β€’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ вмСстС с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ libpython ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ вСрсии (для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ опция –l, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ слСдуСт имя Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ) ΠΈ Π΅Ρ‰Π΅ с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ для Python: libpthread, libm, libutil ΠΈ Ρ‚.ΠΏ.)

β€’ ΠΎΠΏΡ†ΠΈΡ pic ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ ΠΊΠΎΠ΄, Π½Π΅ зависящий ΠΎΡ‚ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎ позволяСт Π² дальнСйшСм динамичСски ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄

β€’ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ трСбуСтся явно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π»Π΅ΠΆΠΈΡ‚ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Python.h (Π² gcc это дСлаСтся ΠΎΠΏΡ†ΠΈΠ΅ΠΉ –I)

β€’ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠΈΠΉΡΡ исполняСмый Ρ„Π°ΠΉΠ» ΠΌΠΎΠ³ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΈΠΌΠ΅Π½Π° для динамичСски Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΡ‹Ρ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, трСбуСтся ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΡƒ ΠΎΠΏΡ†ΠΈΡŽ –E: это ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΠ· gcc с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΡ†ΠΈΠΈ –Wl, -E. (Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС, ΠΌΠΎΠ΄ΡƒΠ»ΡŒ time, Π° это ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π² Π²ΠΈΠ΄Π΅ динамичСски Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΠΎΠ³ΠΎ модуля, Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ из–за Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π΅ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚ ΠΈΠΌΠ΅Π½, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Π² libpython)

Π—Π΄Π΅ΡΡŒ ΠΆΠ΅ слСдуСт ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎ Π·Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, Π²ΡΡ‚Ρ€Π°ΠΈΠ²Π°ΡŽΡ‰Π°Ρ Python, Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π· Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Py_Initialize() ΠΈ Py_Finalize(), Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ это ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ ΡƒΡ‚Π΅Ρ‡ΠΊΠ΅ памяти. Π‘Π°ΠΌ ΠΆΠ΅ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Python ΠΎΡ‡Π΅Π½ΡŒ стабилСн ΠΈ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв Π½Π΅ Π΄Π°Π΅Ρ‚ ΡƒΡ‚Π΅Ρ‡Π΅ΠΊ памяти.

ИспользованиС SWIG

SWIG (Simplified Wrapper and Interface Generator, ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½Ρ‹ΠΉ ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‰ΠΈΠΊ ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ интСрфСйсов) β€” это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ срСдства, сильно ΡƒΠΏΡ€ΠΎΡ‰Π°ΡŽΡ‰Π΅Π΅ (Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… случаях β€” Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅) использованиС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, написанных Π½Π° C ΠΈ C++, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… языках программирования, Π² Ρ‚ΠΎΠΌ числС (Π½Π΅ Π² послСднюю ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ!) Π½Π° Python. НуТно ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ SWIG обСспСчиваСт достаточно ΠΏΠΎΠ»Π½ΡƒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ практичСски всСх возмоТностСй C++, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΏΡ€Π΅Π΄ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ, классы, ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ, наслСдованиС ΠΈ Π΄Π°ΠΆΠ΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ C++. ПослСднСС ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎ, Ссли Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ интСрфСйс ΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ шаблонов.

ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ SWIG достаточно просто, Ссли ΡƒΠΌΠ΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ компилятор ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊ (Ρ‡Ρ‚ΠΎ Π² любом случаС трСбуСтся ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π½Π° C/C++).

ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования SWIG

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π° C, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰Π°Ρ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ (ΠΏΡƒΡΡ‚ΡŒ это Π±ΡƒΠ΄Π΅Ρ‚ вычислСниС частоты появлСния Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… символов Π² строкС):

/* File : freq.c */

#include <stdlib.h>


int * frequency(char s[]) {

 int *freq;

 char *ptr;

 freq = (int*)(calloc(256, sizeof(int)));

 if (freq != NULL)

  for (ptr = s; *ptr; ptr++)

   freq[*ptr] += 1;

 return freq;

}

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ΠΈΠ· Python, Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ интСрфСйсный Ρ„Π°ΠΉΠ» (Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ .i) ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ содСрТания:

/* File : freq.i */

%module freq


%typemap(out) int * {

 int i;

 $result = PyTuple_New(256);

 for(i=0; i<256; i++)

  PyTuple_SetItem($result, i, PyLong_FromLong($1[i]));

 free($1);

}


extern int * frequency(char s[]);

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΠ½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ содСрТат инструкции самого SWIG ΠΈ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹ C/C++-ΠΊΠΎΠ΄Π°, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, с ΠΌΠ°ΠΊΡ€ΠΎΠ²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΠΌΠΈ (Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅: $result, $1). Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ для прСобразования массива Ρ†Π΅Π»Ρ‹Ρ… чисСл Π² ΠΊΠΎΡ€Ρ‚Π΅ΠΆ элСмСнтов Ρ‚ΠΈΠΏΠ° long, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ из–под исходного массива, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΠΎΠ΄ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Π»ΠΈΡΡŒ частоты.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ (подразумСвая, Ρ‡Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ компилятор gcc), созданиС модуля Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ:

swig–python freq.i

gcc–c–fpic freq_wrap.c freq.c -DHAVE_CONFIG_H \

-I/usr/local/include/python2.3 \

–I/usr/local/lib/python2.3/config

gcc–shared freq.o freq_wrap.o–o _freq.so

ПослС этого Π² Ρ€Π°Π±ΠΎΡ‡Π΅ΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ появляСтся Ρ„Π°ΠΉΠ»Ρ‹ _freq.so ΠΈ freq.py, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ вмСстС ΠΈ Π΄Π°ΡŽΡ‚ доступ ΠΊ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

>>> import freq

>>> freq.frequency("ABCDEF")[60:75]

(0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 0L, 0L)

Помимо этого, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° содСрТимоС Ρ„Π°ΠΉΠ»Π° freq_wrap.c, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½ SWIG: Π² Π½Π΅ΠΌ, срСди ΠΏΡ€ΠΎΡ‡ΠΈΡ… Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ, Π½ΡƒΠΆΠ½Ρ‹Ρ… самому SWIG, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ что–то ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌΡƒ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ модуля md5. Π’ΠΎΡ‚ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ этого Ρ„Π°ΠΉΠ»Π° с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠΈ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ frequency():

extern int *frequency(char []);

static PyObject *_wrap_frequency(PyObject *self, PyObject *args) {

 PyObject *resultobj;

 char *arg1;

 int *result;


 if(!PyArg_ParseTuple(args,(char *)"s:frequency",&arg1)) goto fail;

 result = (int *)frequency(arg1);


 {

  int i;

  resultobj = PyTuple_New(256);

  for(i=0; i<256; i++)

   PyTuple_SetItem(resultobj, i, PyLong_FromLong(result[i]));

  free(result);

 }

 return resultobj;

fail:

 return NULL;

}

Π’ качСствС упраТнСния, прСдлагаСтся ΡΠΎΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ это ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ с Ρ„Π°ΠΉΠ»ΠΎΠΌ freq.i ΠΈ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ происходит Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ _wrap_frequency(). Подсказка: ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π΅Ρ‰Π΅ Ρ€Π°Π· ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ ΠΊ C–коду модуля md5.

Π‘Ρ‚ΠΎΠΈΡ‚ Π΅Ρ‰Π΅ Ρ€Π°Π· Π½Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Python, Π² языкС C/C++ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π² явном Π²ΠΈΠ΄Π΅. ИмСнно поэтому Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° функция free() ΠΏΡ€ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΈ Ρ‚ΠΈΠΏΠ°. Если этого Π½Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ памяти. Π­Ρ‚ΠΈ ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ, ΠΏΡ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

>>> import freq

>>> for i in xrange(1000000):

... dummy = freq.frequency("ABCDEF")

>>>

Если функция freq.frequency() ΠΈΠΌΠ΅Π΅Ρ‚ ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ памяти, выполняСмый процСсс ΠΎΡ‡Π΅Π½ΡŒ быстро Π·Π°ΠΉΠΌΠ΅Ρ‚ всю ΠΈΠΌΠ΅ΡŽΡ‰ΡƒΡŽΡΡ ΠΏΠ°ΠΌΡΡ‚ΡŒ.

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Python ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… систСм программирования

Π―Π·Ρ‹ΠΊ программирования Python являСтся сцСнарным языком, Π° Π·Π½Π°Ρ‡ΠΈΡ‚ Π΅Π³ΠΎ основноС Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ β€” интСграция Π² Π΅Π΄ΠΈΠ½ΡƒΡŽ систСму Ρ€Π°Π·Π½ΠΎΡ€ΠΎΠ΄Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ². Π’Ρ‹ΡˆΠ΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Π»Π°ΡΡŒ (низкоуровнСвая) интСграция с C/C++-прилоТСниями. НуТно Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв достаточно ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ с использованиСм ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°. НапримСр, ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ прилоТСния ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±Ρ‰Π°Ρ‚ΡŒΡΡ Ρ‡Π΅Ρ€Π΅Π· XML–RPC, SOAP, CORBA, COM, .NET ΠΈ Ρ‚.ΠΏ. Π’ случаях, ΠΊΠΎΠ³Π΄Π° прилоТСния ΠΈΠΌΠ΅ΡŽΡ‚ интСрфСйс ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΠ· Python ΠΈ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ стандартным вводом–выводом, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ окруТСния. Однако Π΅ΡΡ‚ΡŒ ΠΈ Π±ΠΎΠ»Π΅Π΅ интСрСсныС Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ.

Π‘ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ состояниС Π΄Π΅Π» ΠΏΠΎ ΠΈΠ·Π»Π°Π³Π°Π΅ΠΌΠΎΠΌΡƒ вопросу ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΏΠΎ адрСсу: http://www.python.org/moin/IntegratingPythonWithOtherLanguages

Java

ДокумСнтация ΠΏΠΎ Jython (это рСализация Python Π½Π° Java–платформС) ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Jython ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ нСоспоримыми прСимущСствами Π½Π°Π΄ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ языками, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΌΠΈ Java–байт-ΠΊΠΎΠ΄:

β€’ Jython–код динамичСски ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Ρ‹ Java, хотя Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° ΠΈ статичСская компиляция, Ρ‡Ρ‚ΠΎ позволяСт ΠΏΠΈΡΠ°Ρ‚ΡŒ Π°ΠΏΠΏΠ»Π΅Ρ‚Ρ‹, сСрвлСты ΠΈ Ρ‚.ΠΏ.;

β€’ ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎβ€“ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ модСль Java, Π² Ρ‚ΠΎΠΌ числС, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚ абстрактных Java–классов;

β€’ Jython являСтся Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ Python β€” языка с ΠΏΡ€Π°ΠΊΡ‚ΠΈΡ‡Π½Ρ‹ΠΌ синтаксисом, ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‰Π΅Π³ΠΎ большой Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ, Ρ‡Ρ‚ΠΎ позволяСт ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ сроки Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² Ρ€Π°Π·Ρ‹.

ΠŸΡ€Π°Π²Π΄Π°, ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ограничСния ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Β«ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΒ» Python. НапримСр, Java Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ мноТСствСнного наслСдования, поэтому Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… вСрсиях Jython нСльзя Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ классы ΠΎΡ‚ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Java–классов (Π² Ρ‚ΠΎΠΆΠ΅ врСмя, мноТСствСнноС наслСдованиС поддСрТиваСтся для Python–классов).

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ (Ρ„Π°ΠΉΠ» lines.py) ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠΎΠ»Π½ΡƒΡŽ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡŽ Java–классов с ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠΌ Python:

# Π˜ΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΈΠ· Java

from java.lang import System

from java.awt import *

# А это ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΠΈΠ· Jython

import random


# Класс для рисования Π»ΠΈΠ½ΠΈΠΉ Π½Π° рисункС

class Lines(Canvas):

 # РСализация ΠΌΠ΅Ρ‚ΠΎΠ΄Π° paint()

 def paint(self, g):

  X, Y = self.getSize().width, self.getSize().height

  label.setText("%s x %s" % (X, Y))