**************** ÐÑогÑаммиÑование **************** .. _section-loadattach: ÐагÑÑзка и пÑикÑепление Ñайлов Sage =================================== СледÑÑÑее показÑваеÑ, как подгÑÑжаÑÑ Ð¿ÑогÑÐ°Ð¼Ð¼Ñ Ð² Sage, запиÑаннÑе в оÑделÑнÑй Ñайл. СоздайÑе Ñайл ``example.sage`` Ñо ÑледÑÑÑим ÑодеÑжанием: .. skip :: print "Hello World" print 2^3 ÐÑ Ð¼Ð¾Ð¶ÐµÑе пÑоÑиÑаÑÑ Ð¸ вÑполниÑÑ ``example.sage`` Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ ``load``. .. skip :: sage: load "example.sage" Hello World 8 ÐÑ Ñакже можеÑе пÑикÑепиÑÑ Ñайл Sage к запÑÑенной ÑеÑÑии в помоÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ ``attach``: .. skip :: sage: attach "example.sage" Hello World 8 ТепеÑÑ ÐµÑли Ð²Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñе Ñайл ``example.sage`` и введеÑе пÑÑÑÑÑ ÑÑÑÐ¾ÐºÑ Ð² Sage (Ñ.е. нажмиÑе ``return``), Ñо ÑодеÑжимое ``example.sage`` бÑÐ´ÐµÑ Ð°Ð²ÑомаÑиÑеÑки пеÑегÑÑжено в Sage. Ð ÑаÑÑноÑÑи, ``attach`` авÑомаÑиÑеÑки пеÑегÑÑÐ¶Ð°ÐµÑ Ñайл, как ÑолÑко он изменен, ÑÑо оÑÐµÐ½Ñ Ñдобно пÑи поиÑке оÑибок в коде, Ñогда как ``load`` загÑÑÐ¶Ð°ÐµÑ Ñайл лиÑÑ ÐµÐ´Ð¸Ð½Ð¾Ð¶Ð´Ñ. Ðогда ``example.sage`` загÑÑжаеÑÑÑ Ð² Sage, он пеÑеводиÑÑÑ Ð² Python, а заÑем вÑполнÑеÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¸Ð½ÑеÑпÑеÑаÑоÑа Python. ÐаÑÑаÑÑ Ð½Ð° даннÑÑ Ð¾Ð¿ÐµÑаÑÐ¸Ñ Ð¼Ð¸Ð½Ð¸Ð¼Ð°Ð»ÑнÑ; в оÑновном, ÑÑо вклÑÑÐ°ÐµÑ Ð² ÑÐµÐ±Ñ Ð¿ÐµÑевод ÑелÑÑ ÐºÐ¾Ð½ÑÑÐ°Ð½Ñ Ð² ``Integer()``, дÑобнÑÑ ÐºÐ¾Ð½ÑÑÐ°Ð½Ñ Ð² ``RealNumber()``, Ð·Ð°Ð¼ÐµÐ½Ñ ``^`` на ``**`` и, напÑимеÑ, ``R.2`` на ``R.gen(2)``. ÐеÑÐµÐ²ÐµÐ´ÐµÐ½Ð½Ð°Ñ Ð²ÐµÑÑÐ¸Ñ ``example.sage`` бÑÐ´ÐµÑ ÑодеÑжаÑÑÑÑ Ð² Ñой же диÑекÑоÑии, ÑÑо ``example.sage``, под названием ``example.sage.py``. ÐаннÑй Ñайл бÑÐ´ÐµÑ ÑодеÑжаÑÑ ÑледÑÑÑий код: :: print "Hello World" print Integer(2)**Integer(3) ЦелÑе конÑÑÑанÑÑ Ð¿ÐµÑÐµÐ²ÐµÐ´ÐµÐ½Ñ Ð¸ ``^`` заменено на ``**``. (Ð Python ``^`` ознаÑÐ°ÐµÑ "иÑклÑÑаÑÑее ÐÐÐ" и ``**`` ознаÑÐ°ÐµÑ "возведение в ÑÑепенÑ".) ÐаннÑе опеÑаÑии вÑполнÑÑÑÑÑ Ð² ``sage/misc/interpreter.py``.) ÐÑ Ð¸Ð¼ÐµÐµÑе возможноÑÑÑ Ð²ÑÑавлÑÑÑ Ð¼Ð½Ð¾Ð³Ð¾ÑÑÑоÑнÑй код Ñ Ð¾ÑÑÑÑпами в Sage до ÑÐµÑ Ð¿Ð¾Ñ, пока еÑÑÑ Ð½Ð¾Ð²Ñе ÑÑÑоки Ð´Ð»Ñ Ð½Ð¾Ð²ÑÑ Ð±Ð»Ð¾ÐºÐ¾Ð² (ÑÑо необÑзаÑелÑно Ð´Ð»Ñ Ñайлов). Ðднако, лÑÑÑим ÑпоÑобом Ð´Ð»Ñ Ð²ÑÑавки Ñакого кода ÑвлÑеÑÑÑ ÑÐ¾Ñ Ñанение в Ñайл и иÑполÑзование ``attach``, как опиÑано вÑÑе. .. _section-compile: Создание компилиÑованного кода ============================== СкоÑоÑÑÑ â Ð²Ð°Ð¶Ð½Ð°Ñ ÑоÑÑавлÑÑÑÐ°Ñ Ð² маÑемаÑиÑеÑÐºÐ¸Ñ Ð²ÑÑиÑлениÑÑ . ХоÑÑ Python ÑвлÑеÑÑÑ Ð²ÑÑокоÑÑовневÑм ÑзÑком пÑогÑаммиÑованиÑ, некоÑоÑÑе вÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ñ Ð½Ð° неÑколÑко поÑÑдков бÑÑÑÑее в Python пÑи иÑполÑзовании ÑÑаÑиÑеÑÐºÐ¸Ñ Ñипов даннÑÑ Ð¿Ñи компилиÑовании. ÐекоÑоÑÑе компоненÑÑ Sage бÑли Ð±Ñ ÑлиÑком медленнÑми, бÑÐ´Ñ Ð¾Ð½ напиÑан Ñеликом на Python. ÐÐ»Ñ ÑÑого Sage поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÐºÐ¾Ð¼Ð¿Ð¸Ð»Ð¸ÑованнÑÑ "веÑÑиÑ" Python, коÑоÑÐ°Ñ Ð½Ð°Ð·ÑваеÑÑÑ Cython ([Cyt]_ и [Pyr]_). Cython одновÑеменно Ð¿Ð¾Ñ Ð¾Ð¶ и на Python, и на C. ÐолÑÑинÑÑво конÑÑÑÑкÑий Python, вклÑÑÐ°Ñ Ð¿ÑедÑÑавление ÑпиÑков, ÑÑловнÑе вÑÑажениÑ, код наподобие ``+=``, ÑазÑеÑенÑ; Ð²Ñ Ñакже можеÑе импоÑÑиÑоваÑÑ ÐºÐ¾Ð´, напиÑаннÑй в дÑÑÐ³Ð¸Ñ Ð¼Ð¾Ð´ÑлÑÑ Python. ÐÑоме Ñого, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе обÑÑвлÑÑÑ Ð¿ÑоизволÑнÑе пеÑеменнÑе C и напÑÑмÑÑ Ð¾Ð±ÑаÑаÑÑÑÑ Ðº библиоÑекам C. ÐонеÑнÑй код бÑÐ´ÐµÑ ÑконвеÑÑиÑован в C и обÑабоÑан компилÑÑоÑом C. ÐÐ»Ñ Ñого, ÑÑÐ¾Ð±Ñ ÑоздаÑÑ ÐºÐ¾Ð¼Ð¿Ð¸Ð»Ð¸ÑÑемÑй код в Sage, обÑÑвиÑе Ñайл Ñ ÑаÑÑиÑением ``.spyx`` (вмеÑÑо ``.sage``). ÐÑли Ð²Ñ ÑабоÑаеÑе Ñ Ð¸Ð½ÑеÑÑейÑом коммандной ÑÑÑоки, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе пÑикÑеплÑÑÑ Ð¸ загÑÑжаÑÑ ÐºÐ¾Ð¼Ð¿Ð¸Ð»Ð¸ÑÑемÑй код ÑоÑно Ñак же, как и инÑеÑпÑеÑиÑÑемÑй (на даннÑй моменÑ, пÑикÑепление и загÑÑзка кода на Cython не поддеÑживаеÑÑÑ Ð² инÑеÑÑейÑе Notebook). Само компилиÑование пÑоиÑÑ Ð¾Ð´Ð¸Ñ "за кÑлиÑами", не ÑÑебÑÑ ÐºÐ°ÐºÐ¸Ñ -либо дейÑÑвий Ñ Ð²Ð°Ñей ÑÑоÑонÑ. ÐÑоÑмоÑÑеÑÑ Ð¿ÑÐ¸Ð¼ÐµÑ ÐºÐ¾Ð¼Ð¿Ð¸Ð»Ð¸Ñованного иÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑнкÑии ÑакÑоÑиал, коÑоÑое напÑÑмÑÑ Ð¸ÑполÑзÑÐµÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñеки GMP на C, можно в ``$SAGE_ROOT/examples/programming/sagex/factorial.spyx``. ÐÐ»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð¾Ð¿ÑобоваÑÑ ÑÑо ÑамомÑ, пеÑейдиÑе в ``$SAGE_ROOT/examples/programming/sagex/`` Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ cd, а заÑем вÑÐ¿Ð¾Ð»Ð½Ð¸ÐµÑ ÑледÑÑÑее: .. skip :: sage: load "factorial.spyx" *************************************************** Recompiling factorial.spyx *************************************************** sage: factorial(50) 30414093201713378043612608166064768844377641568960512000000000000L sage: time n = factorial(10000) CPU times: user 0.03 s, sys: 0.00 s, total: 0.03 s Wall time: 0.03 Рданном пÑимеÑе L в конÑе ознаÑÐ°ÐµÑ Python long integer (Ñм. :ref:`section-mathannoy`). ÐамеÑÑÑе, ÑÑо Sage пеÑекомпилиÑÑÐµÑ ``factorial.spyx`` в Ñом ÑлÑÑае, еÑли Ð²Ñ Ð²ÑйдеÑе и пеÑезапÑÑÑиÑе Sage. ÐомпилиÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñека обÑÐ¸Ñ Ð¾Ð±ÑекÑов ÑодеÑжиÑÑÑ Ð² ``$HOME/.sage/temp/hostname/pid/spyx``. ÐÑи ÑÐ°Ð¹Ð»Ñ Ð±ÑдÑÑ ÑÐ´Ð°Ð»ÐµÐ½Ñ Ð¿Ñи вÑÑ Ð¾Ð´Ðµ из Sage. ÐÑе-паÑÑиÑовка не пÑименÑеÑÑÑ Ðº spyx Ñайлам. ÐапÑÐ¸Ð¼ÐµÑ ``1/3`` пÑевÑаÑиÑÑÑ Ð² 0 в spyx Ñайле вмеÑÑо ÑаÑионалÑного ÑиÑла :math:`1/3`. ÐопÑÑÑим, ``foo`` - ÑÑо ÑÑнкÑÐ¸Ñ Ð² библиоÑеке Sage. ÐÐ»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð¸ÑполÑзоваÑÑ ÐµÐµ из spyx-Ñайла, импоÑÑиÑÑйÑе ``sage.all`` и пÑимениÑе ``sage.all.foo``. :: import sage.all def foo(n): return sage.all.factorial(n) ÐоÑÑÑп к ÑÑнкÑиÑм С из внеÑÐ½Ð¸Ñ Ñайлов ------------------------------------- ÐоÑÑÑп к ÑÑнкÑиÑм C из внеÑÐ½Ð¸Ñ ``*.c`` Ñайлов оÑÑÑеÑÑвлÑеÑÑÑ Ð´Ð¾Ð²Ð¾Ð»Ñно пÑоÑÑо. СоздайÑе ÑÐ°Ð¹Ð»Ñ ``test.c`` и ``test.spyx`` в одной диÑекÑоÑии Ñо ÑледÑÑÑим ÑодеÑжанием: Ðод на ÑзÑке С: ``test.c`` :: int add_one(int n) { return n + 1; } Ðод на ÑзÑке Cython: ``test.spyx``: :: cdef extern from "test.c": int add_one(int n) def test(n): return add_one(n) ÐÑполниÑе: .. skip :: sage: attach "test.spyx" Compiling (...)/test.spyx... sage: test(10) 11 Ð Ñом ÑлÑÑае, еÑли понадобиÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑÐ½Ð°Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñека ``foo`` Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ ÑкомпилиÑоваÑÑ ÐºÐ¾Ð´ на C, полÑÑеннÑй из Ñайла Cython, добавÑÑе ``clib foo`` в иÑÑоÑник Cython кода. ÐналогиÑно, дополниÑелÑнÑй С Ñайл ``bar`` Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½ в компилÑÑÐ¸Ñ Ñ Ð¾Ð±ÑÑвлением ``cfile bar``. .. _section-standalone: СамоÑÑоÑÑелÑнÑе ÑкÑипÑÑ Python/Sage =================================== ÐаннÑй ÑамоÑÑоÑÑелÑнÑй ÑкÑÐ¸Ð¿Ñ Sage ÑаÑкладÑÐ²Ð°ÐµÑ Ð½Ð° множиÑели ÑелÑе ÑиÑла, Ð¿Ð¾Ð»Ð¸Ð½Ð¾Ð¼Ñ Ð¸ Ñ.д.: :: #!/usr/bin/env sage -python import sys from sage.all import * if len(sys.argv) != 2: print "Usage: %s <n>"%sys.argv[0] print "Outputs the prime factorization of n." sys.exit(1) print factor(sage_eval(sys.argv[1])) ÐÐ»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð¸ÑполÑзоваÑÑ ÑÑÐ¾Ñ ÑкÑипÑ, ``SAGE_ROOT`` должен бÑÑÑ Ð² PATH. ÐÑли вÑÑеопиÑаннÑй ÑкÑÐ¸Ð¿Ñ Ð½Ð°Ð·ÑваеÑÑÑ ``factor``, ÑледÑÑÑее показÑваеÑ, как его вÑполниÑÑ: :: bash $ ./factor 2006 2 * 17 * 59 bash $ ./factor "32*x^5-1" (2*x - 1) * (16*x^4 + 8*x^3 + 4*x^2 + 2*x + 1) Ð¢Ð¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ =========== ÐаждÑй обÑÐµÐºÑ Ð² Sage Ð¸Ð¼ÐµÐµÑ Ð¾Ð¿ÑеделеннÑй Ñип. Python вклÑÑÐ°ÐµÑ Ð² ÑÐµÐ±Ñ Ð±Ð¾Ð»ÑÑой ÑпекÑÑ Ð²ÑÑÑоеннÑÑ Ñипов Ñогда, как библиоÑеки Sage добавлÑÑÑ ÐµÑе болÑÑе. ÐÑÑÑоеннÑе ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ Python вклÑÑаÑÑ Ð² ÑÐµÐ±Ñ ÑимволÑнÑе ÑÑÑоки, ÑпиÑки, коÑÑежи, ÑелÑе и дÑобнÑе ÑиÑла: :: sage: s = "sage"; type(s) <type 'str'> sage: s = 'sage'; type(s) # ÐÑ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ Ð´Ð²Ð¾Ð¹Ð½Ñе или одинаÑнÑе кавÑÑки <type 'str'> sage: s = [1,2,3,4]; type(s) <type 'list'> sage: s = (1,2,3,4); type(s) <type 'tuple'> sage: s = int(2006); type(s) <type 'int'> sage: s = float(2006); type(s) <type 'float'> Ð ÑÐ²Ð¾Ñ Ð¾ÑеÑÐµÐ´Ñ Sage добавлÑÐµÑ Ð¼Ð½Ð¾Ð³Ð¾ дÑÑÐ³Ð¸Ñ Ñипов даннÑÑ , напÑимеÑ, векÑоÑное поле: :: sage: V = VectorSpace(QQ, 1000000); V Vector space of dimension 1000000 over Rational Field sage: type(V) <class 'sage.modules.free_module.FreeModule_ambient_field_with_category'> ТолÑко опÑеделеннÑе ÑÑнкÑии могÑÑ Ð±ÑÑÑ Ð¿ÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ñ Ðº ``V``. РдÑÑÐ³Ð¸Ñ Ð¼Ð°ÑемаÑиÑеÑÐºÐ¸Ñ Ð¿ÑогÑÐ°Ð¼Ð¼Ð°Ñ ÑÑнкÑии вÑзÑвалиÑÑ Ð±Ñ Ð² "ÑÑнкÑионалÑном" виде: ``foo(V,...)``. Ð Sage опÑеделеннÑе ÑÑнкÑии пÑикÑÐµÐ¿Ð»ÐµÐ½Ñ Ðº ÑÐ¸Ð¿Ñ (или клаÑÑÑ) ``V`` и вÑзÑваÑÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¾Ð±ÑекÑно-оÑиенÑиÑованного ÑинÑакÑиÑа, как в Java или C++, напÑимеÑ, ``V.foo(...)``. ÐÑо ÑпоÑобÑÑвÑÐµÑ ÑомÑ, ÑÑо Ð¸Ð¼ÐµÐ½Ð½Ð°Ñ Ð¾Ð±Ð»Ð°ÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑи не Ð·Ð°Ñ Ð»Ð°Ð¼Ð»ÑеÑÑÑ Ð´ÐµÑÑÑками ÑÑÑÑÑ ÑÑнкÑий, и ознаÑаеÑ, ÑÑо многие ÑÑнкÑии Ñ ÑазнÑм ÑодеÑжанием могÑÑ Ð±ÑÑÑ Ð½Ð°Ð·Ð²Ð°Ð½Ñ "foo" без пÑовеÑки Ñипов аÑгÑменÑов. Также, еÑли ÐÑ Ð¸ÑполÑзÑеÑе Ð¸Ð¼Ñ ÑÑнкÑии повÑоÑно, ÑÑа ÑÑнкÑÐ¸Ñ Ð²Ñе Ñавно доÑÑÑпна (напÑимеÑ, еÑли ÐÑ Ð²ÑзÑваеÑе ÑÑо-Ñо наподобие ``zeta``, а заÑем Ñ Ð¾ÑиÑе вÑÑиÑлиÑÑ Ð·Ð½Ð°Ñение ÑÑнкÑии Riemann-Zeta пÑи 0.5, ÐÑ Ð¼Ð¾Ð¶ÐµÑе напеÑаÑаÑÑ ``s=.5; s.zeta()``). :: sage: zeta = -1 sage: s=.5; s.zeta() -1.46035450880959 РнекоÑоÑÑÑ ÑаÑÑо вÑÑÑеÑаÑÑÐ¸Ñ ÑÑ ÑлÑÑаÑÑ , обÑÑное ÑÑнкÑионалÑное обознаÑение Ñакже ÑпоÑобÑÑвÑÐµÑ ÑдобÑÑÐ²Ñ Ð¸Ð·-за Ñого, ÑÑо маÑемаÑиÑеÑкие вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð²ÑглÑдеÑÑ Ð·Ð°Ð¿ÑÑанно пÑи иÑаолÑзовании обÑекÑно-оÑиенÑиÑованного обознаÑениÑ. ÐапÑимеÑ: :: sage: n = 2; n.sqrt() sqrt(2) sage: sqrt(2) sqrt(2) sage: V = VectorSpace(QQ,2) sage: V.basis() [ (1, 0), (0, 1) ] sage: basis(V) [ (1, 0), (0, 1) ] sage: M = MatrixSpace(GF(7), 2); M Full MatrixSpace of 2 by 2 dense matrices over Finite Field of size 7 sage: A = M([1,2,3,4]); A [1 2] [3 4] sage: A.charpoly('x') x^2 + 2*x + 5 sage: charpoly(A, 'x') x^2 + 2*x + 5 ÐÐ»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð¿ÐµÑеÑиÑлиÑÑ Ð²Ñе ÑленÑ-ÑÑнкÑии Ð´Ð»Ñ :math:`A`, напеÑаÑайÑе ``A.``, а заÑем нажмиÑе ÐºÐ½Ð¾Ð¿ÐºÑ ``[tab]`` на ÐаÑей клавиаÑÑÑе, как опиÑано в Ñазделе :ref:`section-tabcompletion` СпиÑки, коÑÑежи и поÑледоваÑелÑноÑÑи ==================================== Тип даннÑÑ ÑпиÑок Ð¼Ð¾Ð¶ÐµÑ Ñ ÑаниÑÑ Ð² Ñебе ÑлеменÑÑ ÑазнÑÑ Ñипов даннÑÑ . Ðак в C, C++ и Ñ.д., но в оÑлиÑие Ð¾Ñ Ð´ÑÑÐ³Ð¸Ñ Ð°Ð»Ð³ÐµÐ±ÑаиÑеÑÐºÐ¸Ñ ÑиÑÑем, ÑлеменÑÑ ÑпиÑка наÑинаÑÑÑÑ Ñ Ð¸Ð½Ð´ÐµÐºÑа :math:`0`: :: sage: v = [2, 3, 5, 'x', SymmetricGroup(3)]; v [2, 3, 5, 'x', Symmetric group of order 3! as a permutation group] sage: type(v) <type 'list'> sage: v[0] 2 sage: v[2] 5 ÐÑи индекÑиÑовании ÑпиÑка, пÑименение индекÑов, не ÑвлÑÑÑÐ¸Ñ ÑÑ ÑелÑм ÑиÑлом Python, ÑÑабоÑÐ°ÐµÑ Ð½Ð¾ÑмалÑно. :: sage: v = [1,2,3] sage: v[2] 3 sage: n = 2 # Ñелое ÑиÑло Sage sage: v[n] # ÑабоÑÐ°ÐµÑ Ð¿ÑавилÑно 3 sage: v[int(n)] # Ñоже ÑабоÑÐ°ÐµÑ Ð¿ÑавилÑно 3 ФÑнкÑÐ¸Ñ ``range`` ÑÐ¾Ð·Ð´Ð°ÐµÑ ÑпиÑок ÑелÑÑ ÑиÑел, иÑполÑзÑемÑÑ Python(не Sage): :: sage: range(1, 15) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14] ÐÑо Ñдобно, когда Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑпиÑков иÑполÑзÑеÑÑÑ Ð²Ð¸Ð´ ÑпиÑка: :: sage: L = [factor(n) for n in range(1, 15)] sage: print L [1, 2, 3, 2^2, 5, 2 * 3, 7, 2^3, 3^2, 2 * 5, 11, 2^2 * 3, 13, 2 * 7] sage: L[12] 13 sage: type(L[12]) <class 'sage.structure.factorization_integer.IntegerFactorization'> sage: [factor(n) for n in range(1, 15) if is_odd(n)] [1, 3, 5, 7, 3^2, 11, 13] ÐÐ»Ñ Ð±Ð¾Ð»ÑÑего Ð¿Ð¾Ð½Ð¸Ð¼Ð°Ð½Ð¸Ñ ÑпиÑков Ñм. [PyT]_. РаÑÑепление ÑпиÑков - ÑÑо оÑÐµÐ½Ñ ÑдобнÑй инÑÑÑÑменÑ. ÐопÑÑÑим ``L`` - ÑÑо ÑпиÑок, Ñогда ``L[m:n]`` веÑÐ½ÐµÑ Ð¿Ð¾Ð´-ÑпиÑок L, полÑÑеннÑй, наÑÐ¸Ð½Ð°Ñ Ñ ÑлеменÑа на позиÑии :math:`m` и заканÑÐ¸Ð²Ð°Ñ ÑлеменÑом на позиÑии :math:`(n-1)`, как показано ниже. :: sage: L = [factor(n) for n in range(1, 20)] sage: L[4:9] [5, 2 * 3, 7, 2^3, 3^2] sage: print L[:4] [1, 2, 3, 2^2] sage: L[14:4] [] sage: L[14:] [3 * 5, 2^4, 17, 2 * 3^2, 19] ÐоÑÑежи имеÑÑ ÑÑ Ð¾Ð´ÑÑво Ñо ÑпиÑками, однако они неизменÑÐµÐ¼Ñ Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñа ÑозданиÑ. :: sage: v = (1,2,3,4); v (1, 2, 3, 4) sage: type(v) <type 'tuple'> sage: v[1] = 5 Traceback (most recent call last): ... TypeError: 'tuple' object does not support item assignment ÐоÑледоваÑелÑноÑÑи - ÑÑо Ñип даннÑÑ , ÑÑ Ð¾Ð¶Ð¸Ð¹ по ÑвойÑÑвам Ñо ÑпиÑком. ÐоÑледоваÑелÑноÑÑи как Ñип даннÑÑ Ð½Ðµ вÑÑÑÐ¾ÐµÐ½Ñ Ð² Python в оÑлиÑие Ð¾Ñ ÑпиÑков и коÑÑежей. Ðо ÑмолÑаниÑ, поÑледоваÑелÑноÑÑÑ ÑвлÑеÑÑÑ Ð¸Ð·Ð¼ÐµÐ½Ñемой, однако иÑполÑзÑÑ Ð¼ÐµÑод ``set_immutable`` из клаÑÑа ``Sequence``, она Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñделана неизменÑемой, как показано в ÑледÑÑÑем пÑимеÑе. ÐÑе ÑлеменÑÑ Ð¿Ð¾ÑледоваÑелÑноÑÑи имеÑÑ Ð¾Ð±Ñего ÑодиÑелÑ, именÑемого ÑнивеÑÑÑмом поÑледоваÑелÑоÑÑи. :: sage: v = Sequence([1,2,3,4/5]) sage: v [1, 2, 3, 4/5] sage: type(v) <class 'sage.structure.sequence.Sequence_generic'> sage: type(v[1]) <type 'sage.rings.rational.Rational'> sage: v.universe() Rational Field sage: v.is_immutable() False sage: v.set_immutable() sage: v[0] = 3 Traceback (most recent call last): ... ValueError: object is immutable; please change a copy instead. ÐоÑледоваÑелÑноÑÑи могÑÑ Ð±ÑÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ñ Ð²ÐµÐ·Ð´Ðµ, где могÑÑ Ð±ÑÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ñ ÑпиÑки: :: sage: v = Sequence([1,2,3,4/5]) sage: isinstance(v, list) True sage: list(v) [1, 2, 3, 4/5] sage: type(list(v)) <type 'list'> ÐÐ°Ð·Ð¸Ñ Ð´Ð»Ñ Ð²ÐµÐºÑоÑного Ð¿Ð¾Ð»Ñ ÑвлÑеÑÑÑ Ð½ÐµÐ¸Ð·Ð¼ÐµÐ½Ñемой поÑледоваÑелÑноÑÑÑÑ, Ñак как оÑÐµÐ½Ñ Ð²Ð°Ð¶Ð½Ð¾ не изменÑÑÑ Ð¸Ñ . ÐÑо показано в ÑледÑÑÑем пÑимеÑе: :: sage: V = QQ^3; B = V.basis(); B [ (1, 0, 0), (0, 1, 0), (0, 0, 1) ] sage: type(B) <class 'sage.structure.sequence.Sequence_generic'> sage: B[0] = B[1] Traceback (most recent call last): ... ValueError: object is immutable; please change a copy instead. sage: B.universe() Vector space of dimension 3 over Rational Field СловаÑи ======= СловаÑÑ (Ñакже именÑемÑй аÑÑоÑиаÑивнÑм маÑÑивом) - ÑÑо ÑопоÑÑавление 'Ñ ÑÑиÑÑемÑÑ ' обÑекÑов (как ÑÑÑоки, ÑиÑла и коÑÑежи из Ð½Ð¸Ñ ; Ñм. докÑменÑаÑÐ¸Ñ Python: http://docs.python.org/tut/node7.html и http://docs.python.org/lib/typesmapping.html) пÑоизволÑнÑм обÑекÑам. :: sage: d = {1:5, 'sage':17, ZZ:GF(7)} sage: type(d) <type 'dict'> sage: d.keys() [1, 'sage', Integer Ring] sage: d['sage'] 17 sage: d[ZZ] Finite Field of size 7 sage: d[1] 5 ТÑеÑий клÑÑ Ð¿Ð¾ÐºÐ°Ð·ÑваеÑ, ÑÑо индекÑÑ ÑловаÑÑ Ð¼Ð¾Ð³Ñ Ð±ÑÑÑ ÑложнÑми, как, напÑимеÑ, колÑÑо ÑелÑÑ ÑиÑел. Ðожно пÑевÑаÑиÑÑ Ð²ÑÑеопиÑаннÑй ÑловаÑÑ Ð² ÑпиÑок Ñ Ñем же ÑодеÑжимÑм: .. link :: sage: d.items() [(1, 5), ('sage', 17), (Integer Ring, Finite Field of size 7)] ЧаÑÑо иÑполÑзÑемой пÑакÑикой ÑвлÑеÑÑÑ Ð¿Ñоизведение иÑеÑаÑий по паÑам в ÑловаÑе: :: sage: d = {2:4, 3:9, 4:16} sage: [a*b for a, b in d.iteritems()] [8, 27, 64] Ðак показÑÐ²Ð°ÐµÑ Ð¿Ð¾Ñледний пÑимеÑ, ÑловаÑÑ Ð½Ðµ ÑпоÑÑдоÑен. ÐножеÑÑва ========= Ð Python еÑÑÑ Ð²ÑÑÑоеннÑй Ñип множеÑÑво. ÐлавнÑм пÑеимÑÑеÑÑвом ÑÑого Ñипа ÑвлÑеÑÑÑ Ð±ÑÑÑÑÑй пÑоÑмоÑÑ, пÑовеÑка Ñого, пÑÐ¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð¸Ñ Ð»Ð¸ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑвÑ, а Ñакже обÑÑнÑе опеÑаÑии из ÑеоÑии множеÑÑв. :: sage: X = set([1,19,'a']); Y = set([1,1,1, 2/3]) sage: X set(['a', 1, 19]) sage: Y set([1, 2/3]) sage: 'a' in X True sage: 'a' in Y False sage: X.intersection(Y) set([1]) Ð Sage Ñакже имееÑÑÑ Ñвой Ñип даннÑÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво, коÑоÑÑй (в некоÑоÑÑÑ ÑлÑÑаÑÑ ) оÑÑÑеÑÑвлен Ñ Ð¸ÑполÑзованием вÑÑÑоенного Ñипа множеÑÑво Python, но вклÑÑÐ°ÐµÑ Ð² ÑÐµÐ±Ñ ÑÑнкÑионалÑноÑÑÑ, ÑвÑзаннÑÑ Ñ Sage. СоздайÑе множеÑÑво Sage Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ``Set(...)``. ÐапÑимеÑ, :: sage: X = Set([1,19,'a']); Y = Set([1,1,1, 2/3]) sage: X {'a', 1, 19} sage: Y {1, 2/3} sage: X.intersection(Y) {1} sage: print latex(Y) \left\{1, \frac{2}{3}\right\} sage: Set(ZZ) Set of elements of Integer Ring ÐÑеÑаÑоÑÑ ========= ÐÑеÑаÑоÑÑ - ÑÑо ÑÑавниÑелÑно недавнее добавление в Python, коÑоÑое ÑвлÑеÑÑÑ Ð¾ÑÐµÐ½Ñ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñм в маÑемаÑиÑеÑÐºÐ¸Ñ Ð¿ÑиложениÑÑ . ÐеÑколÑко пÑимеÑов иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ÑеÑаÑоÑов пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ñ Ð½Ð¸Ð¶Ðµ; подÑобнее Ñм. [PyT]_. ÐдеÑÑ ÑоздаеÑÑÑ Ð¸ÑеÑаÑÐ¾Ñ Ð´Ð»Ñ ÐºÐ²Ð°Ð´ÑаÑов неоÑÑиÑаÑелÑнÑÑ ÑиÑел до :math:`10000000`. :: sage: v = (n^2 for n in xrange(10000000)) sage: v.next() 0 sage: v.next() 1 sage: v.next() 4 СледÑÑÑий пÑÐ¸Ð¼ÐµÑ - Ñоздание иÑеÑаÑоÑов из пÑоÑÑÑÑ ÑиÑел вида :math:`4p+1` Ñ Ð¿ÑоÑÑÑм :math:`p` и пÑоÑмоÑÑ Ð½ÐµÑколÑÐºÐ¸Ñ Ð¿ÐµÑвÑÑ Ð·Ð½Ð°Ñений: :: sage: w = (4*p + 1 for p in Primes() if is_prime(4*p+1)) sage: w # random output на ÑледÑÑÑей ÑÑÑоке 0xb0853d6c Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð´ÑÑгим ÑеÑÑнадÑаÑиÑиÑнÑм ÑиÑлом <generator object at 0xb0853d6c> sage: w.next() 13 sage: w.next() 29 sage: w.next() 53 ÐпÑеделеннÑе колÑÑа, как и конеÑнÑе Ð¿Ð¾Ð»Ñ Ð¸ ÑелÑе ÑиÑла, имеÑÑ Ð¸ÑеÑаÑоÑÑ: :: sage: [x for x in GF(7)] [0, 1, 2, 3, 4, 5, 6] sage: W = ((x,y) for x in ZZ for y in ZZ) sage: W.next() (0, 0) sage: W.next() (0, 1) sage: W.next() (0, -1) ЦиклÑ, ÑÑнкÑии, ÑпÑавлÑÑÑие конÑÑÑÑкÑии и ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ =================================================== ÐÑ Ñже видели неÑколÑко пÑимеÑов Ñ Ð¸ÑполÑзованием Ñиклов ``for``. Ð Python Ñикл ``for`` Ð¸Ð¼ÐµÐµÑ ÑабÑлиÑованнÑÑ ÑÑÑÑкÑÑÑÑ: :: >>> for i in range(5): ... print(i) ... 0 1 2 3 4 ÐамеÑÑÑе двоеÑоÑие на конÑе вÑÑажениÑ("do" или "od", как GAP или Maple, не иÑполÑзÑÑÑÑÑ), а оÑÑÑÑÐ¿Ñ Ð¿ÐµÑед "Ñелом" Ñикла, в ÑаÑÑноÑÑи, пеÑед ``print(i)``. ÐÑи оÑÑÑÑÐ¿Ñ Ð²Ð°Ð¶Ð½Ñ. Ð Sage оÑÑÑÑÐ¿Ñ ÑÑавÑÑÑÑ Ð°Ð²ÑомаÑиÑеÑки пÑи нажаÑии ``enter`` поÑле ":", как показано ниже. :: sage: for i in range(5): ....: print(i) # нажмиÑе Enter Ð´Ð²Ð°Ð¶Ð´Ñ ....: 0 1 2 3 4 Символ ``=`` иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð¿ÑиÑваиваниÑ. Символ ``==`` иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð¿ÑовеÑки ÑавенÑÑва: :: sage: for i in range(15): ... if gcd(i,15) == 1: ... print(i) 1 2 4 7 8 11 13 14 ÐмейÑе в видÑ, как ÑабÑлÑÑÐ¸Ñ Ð¾Ð¿ÑеделÑÐµÑ ÑÑÑÑкÑÑÑÑ Ð±Ð»Ð¾ÐºÐ¾Ð² Ð´Ð»Ñ Ð¾Ð¿ÐµÑаÑоÑов ``if``, ``for`` и ``while``: :: sage: def legendre(a,p): ... is_sqr_modp=-1 ... for i in range(p): ... if a % p == i^2 % p: ... is_sqr_modp=1 ... return is_sqr_modp sage: legendre(2,7) 1 sage: legendre(3,7) -1 ÐонеÑно, ÑÑо не ÑÑÑекÑÐ¸Ð²Ð½Ð°Ñ ÑеализаÑÐ¸Ñ Ñимвола ÐежандÑа! ÐаннÑй пÑÐ¸Ð¼ÐµÑ ÑлÑÐ¶Ð¸Ñ Ð»Ð¸ÑÑ Ð¸Ð»Ð»ÑÑÑÑаÑией ÑазнÑÑ Ð°ÑпекÑов пÑогÑаммиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð² Python/Sage. ФÑнкÑÐ¸Ñ {kronecker}, вÑÑÑÐ¾ÐµÐ½Ð½Ð°Ñ Ð² Sage, подÑÑиÑÑÐ²Ð°ÐµÑ Ñимвол ÐежандÑа ÑÑÑекÑивно Ñ Ð¸ÑполÑзованием библиоÑек C, в ÑаÑÑноÑÑи, Ñ Ð¸ÑполÑзованием PARI. СÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ ``==``, ``!=``, ``<=``, ``>=``, ``>``, ``<`` Ð¼ÐµÐ¶Ð´Ñ ÑиÑлами авÑомаÑиÑеÑки пеÑеводÑÑ Ð¾Ð±Ð° Ñлена в одинаковÑй Ñип: :: sage: 2 < 3.1; 3.1 <= 1 True False sage: 2/3 < 3/2; 3/2 < 3/1 True True ÐÑакÑиÑеÑки лÑбÑе два обÑекÑа могÑÑ Ð±ÑÑÑ ÑÑавненÑ. :: sage: 2 < CC(3.1,1) True sage: 5 < VectorSpace(QQ,3) # random output True ÐÑполÑзÑйÑе пеÑеменнÑе bool Ð´Ð»Ñ ÑимволÑнÑÑ Ð½ÐµÑавенÑÑв: :: sage: x < x + 1 x < x + 1 sage: bool(x < x + 1) True ÐÑи ÑÑавнении обÑекÑов Ñазного Ñипа в болÑÑинÑÑве ÑлÑÑаев Sage попÑÑаеÑÑÑ Ð½Ð°Ð¹Ñи канониÑеÑкое пÑиведение Ð¾Ð±Ð¾Ð¸Ñ Ðº обÑÐµÐ¼Ñ ÑодиÑелÑ. ÐÑи ÑÑÐ¿ÐµÑ Ðµ, ÑÑавнение вÑполнÑеÑÑÑ Ð¼ÐµÐ¶Ð´Ñ Ð¿ÑиведÑннÑми обÑекÑами; еÑли неÑ, Ñо обÑекÑÑ Ð±ÑдÑÑ ÑаÑÑÐµÐ½ÐµÐ½Ñ ÐºÐ°Ðº неÑавнÑе. ÐÐ»Ñ Ð¿ÑовеÑки ÑавенÑÑва двÑÑ Ð¿ÐµÑеменнÑÑ Ð¸ÑполÑзÑйÑе ``is``. ÐапÑимеÑ: :: sage: 1 is 2/2 False sage: 1 is 1 False sage: 1 == 2/2 True Ð ÑледÑÑÑÐ¸Ñ Ð´Ð²ÑÑ ÑÑÑÐ¾ÐºÐ°Ñ Ð¿ÐµÑвое неÑавенÑÑво Ð´Ð°ÐµÑ ``False``, Ñак как Ð½ÐµÑ ÐºÐ°Ð½Ð¾Ð½Ð¸ÑеÑкого моÑÑизма :math:`\QQ\to \GF{5}`, поÑÑÐ¾Ð¼Ñ Ð½Ðµ ÑÑÑеÑÑвÑÐµÑ ÐºÐ°Ð½Ð¾Ð½Ð¸ÑеÑкого ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñ :math:`1` в :math:`\GF{5}` и :math:`1 \in \QQ`. Ðднако, ÑÑÑеÑÑвÑÐµÑ ÐºÐ°Ð½Ð¾Ð½Ð¸ÑеÑкое пÑиведение :math:`\ZZ \to \GF{5}`, поÑÑÐ¾Ð¼Ñ Ð²ÑоÑое вÑÑажение Ð´Ð°ÐµÑ ``True``. ÐамеÑÑÑе, поÑÑдок не Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°ÑениÑ. :: sage: GF(5)(1) == QQ(1); QQ(1) == GF(5)(1) False False sage: GF(5)(1) == ZZ(1); ZZ(1) == GF(5)(1) True True sage: ZZ(1) == QQ(1) True ÐÐÐÐÐÐÐÐ: СÑавнение в Sage пÑоводиÑÑÑ Ð±Ð¾Ð»ÐµÐµ жÑÑÑко, Ñем в Magma, коÑоÑÐ°Ñ Ð¾Ð±ÑÑвлÑÐµÑ :math:`1 \in \GF{5}` ÑавнÑм :math:`1 \in \QQ`. :: sage: magma('GF(5)!1 eq Rationals()!1') # optional - magma true ÐÑоÑилиÑование ============== ÐвÑÐ¾Ñ Ñаздела: Martin Albrecht (malb@informatik.uni-bremen.de) "ÐÑеждевÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¾Ð¿ÑимизаÑÐ¸Ñ - ÑÑо коÑÐµÐ½Ñ Ð²Ñего зла." - ÐоналÑд ÐнÑÑ Ð§Ð°ÑÑо оÑÐµÐ½Ñ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ пÑовеÑÑÑÑ ÐºÐ¾Ð´ на ÑлабÑе меÑÑа, понимаÑÑ, какие ÑаÑÑи оÑнимаÑÑ Ð½Ð°Ð¸Ð±Ð¾Ð»ÑÑее вÑÐµÐ¼Ñ Ð½Ð° вÑÑиÑлениÑ; Ñаким обÑазом можно ÑзнаÑÑ, какие ÑаÑÑи кода надо опÑимизиÑоваÑÑ. Python и Sage пÑедоÑÑавлÑÐµÑ Ð½ÐµÑколÑко возможноÑÑей Ð´Ð»Ñ Ð¿ÑоÑилиÑÐ¾Ð²Ð°Ð½Ð¸Ñ (Ñак назÑваеÑÑÑ ÑÑÐ¾Ñ Ð¿ÑоÑеÑÑ). СамÑй легкий пÑÑÑ - ÑÑо иÑполÑзование ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ ``prun``. Ðна возвÑаÑÐ°ÐµÑ ÐºÑаÑкÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ Ñом, какое вÑÐµÐ¼Ñ Ð¾ÑÐ½Ð¸Ð¼Ð°ÐµÑ ÐºÐ°Ð¶Ð´Ð°Ñ ÑÑнкÑиÑ. Ðалее ÑледÑÐµÑ Ð¿ÑÐ¸Ð¼ÐµÑ ÑÐ¼Ð½Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð°ÑÑÐ¸Ñ Ð¸Ð· конеÑнÑÑ Ð¿Ð¾Ð»ÐµÐ¹: :: sage: k,a = GF(2**8, 'a').objgen() sage: A = Matrix(k,10,10,[k.random_element() for _ in range(10*10)]) .. skip :: sage: %prun B = A*A 32893 function calls in 1.100 CPU seconds Ordered by: internal time ncalls tottime percall cumtime percall filename:lineno(function) 12127 0.160 0.000 0.160 0.000 :0(isinstance) 2000 0.150 0.000 0.280 0.000 matrix.py:2235(__getitem__) 1000 0.120 0.000 0.370 0.000 finite_field_element.py:392(__mul__) 1903 0.120 0.000 0.200 0.000 finite_field_element.py:47(__init__) 1900 0.090 0.000 0.220 0.000 finite_field_element.py:376(__compat) 900 0.080 0.000 0.260 0.000 finite_field_element.py:380(__add__) 1 0.070 0.070 1.100 1.100 matrix.py:864(__mul__) 2105 0.070 0.000 0.070 0.000 matrix.py:282(ncols) ... Рданном пÑимеÑе ``ncalls`` - ÑÑо колиÑеÑÑво вÑзовов, ``tottime`` - ÑÑо обÑее вÑемÑ, заÑÑаÑенное на опÑеделеннÑÑ ÑÑнкÑÐ¸Ñ (за иÑклÑÑением вÑемени вÑзовов ÑÑб-ÑÑнкÑий), ``percall`` - ÑÑо оÑноÑение ``tottime`` к ``ncalls``. ``cumtime`` - ÑÑо обÑее вÑемÑ, поÑÑаÑенное в ÑÑой и вÑÐµÑ ÑÑб-ÑÑнкÑиÑÑ , ``percall`` - ÑÑо оÑноÑение ``cumtime`` к ÑиÑÐ»Ñ Ð¿ÑимиÑивнÑÑ Ð²Ñзовов, ``filename:lineno(function)`` пÑедоÑÑавлÑÐµÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ каждой ÑÑнкÑии. Чем вÑÑе ÑÑнкÑÐ¸Ñ Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ Ð² ÑÑом ÑпиÑке, Ñем болÑÑе вÑемени она оÑнимаеÑ. ``prun?`` Ð¿Ð¾ÐºÐ°Ð¶ÐµÑ Ð´ÐµÑали о Ñом, как иÑполÑзоваÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð¿ÑоÑилиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ понимаÑÑ ÑезÑлÑÑÐ°Ñ ÐµÐµ иÑполÑзованиÑ. ÐÑоÑилиÑÑÑÑÐ°Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²Ð¿Ð¸Ñана в обÑÐµÐºÑ Ð´Ð»Ñ Ð±Ð¾Ð»ÐµÐµ подÑобного изÑÑениÑ: .. skip :: sage: %prun -r A*A sage: stats = _ sage: stats? ÐамеÑка: ввод ``stats = prun -r A\*A`` оÑобÑÐ°Ð·Ð¸Ñ ÑинÑакÑиÑеÑкÑÑ Ð¾ÑибкÑ, Ñак как ``prun`` - ÑÑо команда оболоÑки IPython, а не обÑÑÐ½Ð°Ñ ÑÑнкÑиÑ. ÐÐ»Ñ Ð³ÑаÑиÑеÑкого оÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¿ÑоÑилиÑÑÑÑей инÑоÑмаÑии, ÐÑ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ hotshot - неболÑÑой ÑкÑипÑ, названнÑй hotshot2cachetree и пÑогÑÐ°Ð¼Ð¼Ñ ``kcachegrind`` (ÑолÑко в Unix). TÐ¾Ñ Ð¶Ðµ пÑÐ¸Ð¼ÐµÑ Ñ Ð¸ÑполÑзованием hotshot: .. skip :: sage: k,a = GF(2**8, 'a').objgen() sage: A = Matrix(k,10,10,[k.random_element() for _ in range(10*10)]) sage: import hotshot sage: filename = "pythongrind.prof" sage: prof = hotshot.Profile(filename, lineevents=1) .. skip :: sage: prof.run("A*A") <hotshot.Profile instance at 0x414c11ec> sage: prof.close() РезÑлÑÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð¿Ð¾Ð¼ÐµÑен в Ñайл ``pythongrind.prof`` в ÑекÑÑей ÑабоÑей диÑекÑоÑии. ÐÐ»Ñ Ð²Ð¸Ð·ÑализаÑии ÑÑа инÑоÑмаÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÐµÑеведена в ÑоÑÐ¼Ð°Ñ cachegrind. Ð ÑиÑÑемной оболоÑке введиÑе .. skip :: hotshot2calltree -o cachegrind.out.42 pythongrind.prof ÐÑÑ Ð¾Ð´Ð½Ð¾Ð¹ Ñайл ``cachegrind.out.42`` ÑепеÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑоанализиÑован Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ``kcachegrind``. ÐамеÑÑÑе, ÑÑо обознаÑение ``cachegrind.out.XX`` должно бÑÑÑ ÑоблÑдено.