Python

Программные средства разработки

Модераторы: Olej, vikos

Аватара пользователя
Olej
Писатель
Сообщения: 15992
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Python

Непрочитанное сообщение Olej » 06 авг 2013, 01:19

Olej писал(а):Нужно это обязательно проверить на последних версиях, что там происходит!
Вот такой тест ... это 1-е грубое приближение что получилось:

Код: Выделить всё

#!/usr/bin/python
# -*- coding: utf-8 -*-

import time
import sys
import getopt
import string
import threading
import os

def ncount( n ) : # тестовая CPU-загружающая функция
    while n > 0 : n -= 1

repnum = 10000000
thrnum = 2
mode = 'stp' 

try : 
    opts, args = getopt.getopt( sys.argv[1:], "t:n:m:" )
except getopt.GetoptError :
    print "недопустимая опция команды или её значение"
    sys.exit( 2 )
for opt, arg in opts :
    if cmp( opt[ 1: ], 't' ) == 0 : thrnum = string.atoi( arg )
    if cmp( opt[ 1: ], 'n' ) == 0 : repnum = string.atoi( arg )
    if cmp( opt[ 1: ], 'm' ) == 0 : mode = arg
    
print "число выполнений %i" % thrnum
print "число циклов в выполнении %i" % repnum

if 's' in mode :
    print "============ последовательное выполнение ============"
    clc = time.time()
    for i in range( thrnum ) : ncount( repnum )
    clc = time.time() - clc
    print "время %5.2f секунд" % clc


if 't' in mode :
    print "================ параллельные потоки ================"
    threads = []
    for n in range( thrnum ) :
        tid = threading.Thread( target = ncount, args=( repnum, ) )
        threads.append( tid )
        tid.setDaemon( 1 )
    clc = time.time()
    for n in range( thrnum ) : threads[ n ].start()
    for n in range( thrnum ) : threads[ n ].join()
    clc = time.time() - clc
    print "время %5.2f секунд" % clc

if 'p' in mode :
    print "================ параллельные процессы ================"
    threads = []
    clc = time.time()
    for n in range( thrnum ) :
        try : pid = os.fork();
        except :
            print "error: create child process"
            sys.exit( 33 )
        if pid == 0 :
            ncount( repnum )
            sys.exit( 3 )
        if pid > 0 :
            threads.append( pid )
    for p in threads :
        pid, status = os.wait()
    clc = time.time() - clc
    print "время %5.2f секунд" % clc
Здесь 3 возможных режима испытания (опция -m):
- последовательное выполнение (значение -m s) серии испытаний (число таких испытаний - опция -t);
- выполнение той же серии в несколько параллельных потоков (значение -m t);
- выполнение той же серии в несколько параллельных прочессов (значение -m p);
Опцией -n можно изменять объём "работы" (тупых циклов) в единичном испытании.
Если никакие опции не указывать (они больше для отладки), то число циклов = 10000000, число ветвей (испытаний) = 2, а испытания одно за другим проделываются все: последовательное выполнение, потоки, процессы...

И вот что имеем - для тех, кто понимает вкус в подобных извращениях, это очень любопытный результат!:

Код: Выделить всё

bash-4.2$ cat /proc/cpuinfo | grep ^processor
processor	: 0
processor	: 1

Код: Выделить всё

bash-4.2$ python -V
Python 2.7.3

Код: Выделить всё

bash-4.2$ ./mthrs.py
число выполнений 2
число циклов в выполнении 10000000
============ последовательное выполнение ============
время  2.89 секунд
================ параллельные потоки ================
время  3.46 секунд
================ параллельные процессы ================
время  2.06 секунд

Код: Выделить всё

bash-4.2$ ./mthrs.py -t5
число выполнений 5
число циклов в выполнении 10000000
============ последовательное выполнение ============
время  7.26 секунд
================ параллельные потоки ================
время  9.99 секунд
================ параллельные процессы ================
время  4.77 секунд
Наверное, нужно сюда же добавить, что а). выполнение в Linux, б). ядро (сборка) 3.5.2-1.fc17.i686.PAE ... потому, что результаты отличаются от того, что описывает автор статьи для реализации MacOS, и что там к статье отмечали и в комментариях.

Но общий итог показанного остаётся тем же:
- при выполнении на 2-х процессорах задачи в 2 потока, общее время выполнения не уменьшается, а увеличивается по сравнению с тем, если эту же работу выполнить последовательно 2 раза один за другим;
- а вот распараллелив загрузку CPU средствами операционной системы, когда работает независимо 2 интерпретатора Python, выполняющих каждый свою задачу - вот здесь можно получить экономию за счёт 2-х процессоров;

Аватара пользователя
Olej
Писатель
Сообщения: 15992
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Python

Непрочитанное сообщение Olej » 06 авг 2013, 11:57

Olej писал(а): Но общий итог показанного остаётся тем же:
- при выполнении на 2-х процессорах задачи в 2 потока, общее время выполнения не уменьшается, а увеличивается по сравнению с тем, если эту же работу выполнить последовательно 2 раза один за другим;
- а вот распараллелив загрузку CPU средствами операционной системы, когда работает независимо 2 интерпретатора Python, выполняющих каждый свою задачу - вот здесь можно получить экономию за счёт 2-х процессоров;
Дальнейшее обсуждение этих вопросов, из-за их важности, перенесено в отдельную тему: Python - параллелизм.

Аватара пользователя
Olej
Писатель
Сообщения: 15992
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Python

Непрочитанное сообщение Olej » 07 окт 2013, 19:54

Виктория писал(а): Совсем модный курс на Coursera -An Introduction to Interactive Programming in Python
Вот сейчас только этот курс начался.
An Introduction to Interactive Programming in Python
by Joe Warren, John Greiner, Stephen Wong, Scott Rixner
Я посмотрю что он из себя будет представлять ... потом здесь расскажу ... для тех, кто не хочет в этом курсе участвовать.

Аватара пользователя
Olej
Писатель
Сообщения: 15992
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Python

Непрочитанное сообщение Olej » 07 окт 2013, 20:52

Olej писал(а):Я посмотрю что он из себя будет представлять ... потом здесь расскажу ... для тех, кто не хочет в этом курсе участвовать.
Для начала ... они слепили такой WEB-терминал для выполнения Python-программ - CodeSkulptor.
CodeSkulptor is a browser-based Python interpreter, as featured in the online course “An Introduction to Interactive Programming in Python”. It implements a subset of Python 2, plus the addition of two graphical libraries, SimpleGui and SimplePlot.
CodeSkulptor was created in 2012 as a tool for teaching Python programming, especially to beginners. A driving goal is ease-of-use. Some of its main advantages for teaching are

students do not need to install any software,
students in a course will all have the same Python version and the same editor, and
students can access the same programming environment and code files from any computer.
It was initially created for an online course, “An Introduction to Interactive Programming in Python”, by Joe Warren, Scott Rixner, John Greiner, and Stephen Wong. It is also used in Computer Science courses at Rice University.

Scott Rixner continues to develop CodeSkulptor, while John Greiner is developing CodeSkulptor's documentation.
Забавная такая штучка ... только ... ненужная ;-) , мне и простого терминала CPython для того же достаточно, не говоря о множестве других сред выполнения... ;-)
Напомнило ;-) :
- Святой Отец, ну скажите: я правильно живу?
- Правильно ... ... Но напрасно.
Игрушка такая интересная ... вот их демос как выполняется:
Map magnifier – Chromium_015.png
P.S. Вся эта штука, кроме всего, работает более-менее в Chrome (и в FireFox и т.д. как они говорят), но абсолютно неработоспособно в Opera, что меня поначалу и заморочило...

Там же у них ... кой-какой ;-) WEB-справочник по Python: http://www.codeskulptor.org/docs.html#tabs-Python.

Аватара пользователя
Olej
Писатель
Сообщения: 15992
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Python

Непрочитанное сообщение Olej » 14 окт 2013, 21:36

Olej писал(а):
Виктория писал(а): Совсем модный курс на Coursera -An Introduction to Interactive Programming in Python
Вот сейчас только этот курс начался.
An Introduction to Interactive Programming in Python
by Joe Warren, John Greiner, Stephen Wong, Scott Rixner
Я посмотрю что он из себя будет представлять ... потом здесь расскажу ... для тех, кто не хочет в этом курсе участвовать.
Курс их - это 6-7 лекций за неделю ~15 мин. каждая - видеоуроки (на английском языке видео ... в темпе живой речи - если бы я очень сильно поднатужился, то, пожалуй, успел бы в общих чертах понять что они хотят сказать ... но я так сильно напрягаться не стал ;-) ).

После каждой недели - тестовые задачи (9-10 шт.), до 20 попыток успешно сдать тест. Вот это я попробовал... решить 2 их задания 2-х первых недель, без всякого слушания их лекций ("без подготовки" ;-) ) ... получил по 100 балов из 100 возможных с 1-й попытки по каждому.

Уровнем что-то как-то мне это напоминает ... профтехучилище штукатуров-плиточников советского периода, ну, техникума, на крайний случай.
И вообще, фото этой развесёлой компании Coursera, которое они прислали в приглашении на начало курса, как-то напомнило мне сильно ... компьютерную академию "ШАГ" - когда 3 одесских еврея развернули транснациональную сеть подготовки IT специалистов по любым специальностям и в считанные месяцы :mrgreen: ... весь Интернет рекламой до сих пор полнится.
Вложения
august_newsletter_staff_banner_2.jpg

Аватара пользователя
Olej
Писатель
Сообщения: 15992
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Python

Непрочитанное сообщение Olej » 23 окт 2013, 12:52

Виктория писал(а): Совсем модный курс на Coursera -An Introduction to Interactive Programming in Python
Я продолжаю смотреть (скоро уже 20 дней ;-) ) что из себя представляет этот обещанный курс... Он не столько "модный", сколько странный :-o :
- вместо инсталляции (простейшей) стандартной оболочки CPython (или пусть IDLE) они предлагают всё делать в их эксклюзивной WEB-оболочке CodeSkulptor (см. выше) ... которая, кроме всего прочего, работает далеко не во всех WEB-браузерах (они предупреждают о IE, а я - о Opera ;-) );
- со 2-й недели лекций (ещё толком не рассказав о типах данных, операциях, и др.!) они начинают переводить обучение на событийно-управляемое программирование и программирование GUI-приложений (это для того, чтобы сразу писать "модные" программы? ;-) )
- но для GUI событийного программирования (пусть так!) они используют не какой-то более-менее стандартный или общеизвестный GUI-фреймворк, котогрыйх существует (и с хорошими описаниями!) множество (Tkinter, PyQt, PyGTK, wxPython, Pygames и др.), а свой собственный эксклюзивный модуль simplegui ...
- который имеет собственную структуру (которую ещё изучать нужно, и это только для того, чтобы работать в учебном курсе, а потом забыть :-( ), и структуру (классы, методы, атрибуты) достаточно убогую ... достаточно того, что там просто нет (я не нашёл?) способа явного управления фокусом ввода для составляющих виджетов (все на равных + щёлкай мышкой)...
- этот их simplegui достаточно скудно описан (http://www.codeskulptor.org/docs.html#tabs-Graphics) а в коде (simplegui.py) вообще недоступен (чтобы использовать автономно с CPython, например)
- кроме того, этот GUI-фреймворк simplegui (пусть даже учебный) создаёт фиксированнное оконное изображение, фактически без внятного оконного компоновщика, что-то по типу того, что я на картинке нарисовал (это я своё "домашнее задание" по их мини-проекту №2 показал: "угадай число"):
Guess_number_003.png
Guess_number_003.png (21.52 КБ) 5886 просмотров
P.S. Потом ещё такая маленькая "деталь" ... их WEB-оболочка CodeSkulptor, которую вместе с курсом по Python готовили (анонсировали) последние пол-года - она "жрёт" только синтаксис Python 2, но не Python 3.


Но нашим отечественным умникам, занимающимся обучением ... тому же самому "ИНТУИТ", можно бы многому у них поучиться:
- они формулируют там "мини проекты" ... как в качестве тестовых работ, заданий ...
- которые сохраняются на их сайте ...
- а потом учащемуся предлагается "оценить проекты других 5-ти студентов" по набору критериев (запускается ли задача, не возбуждает ли исключений, правильные ли выдаёт результаты, ...)
- так что даже проверкой домашних работ студентов заниматься не надо - пусть сами у себя (друг у друга) и проверяют :roll: .

В общем, их учебный курс оставляет очень странное ощущение:
- здесь и весьма большая инфраструктура наворочена (создана) вокруг учебного курса (tools всякие)...
- и какие-то любопытные порой методологические изыски...
- и всё это при странном, непоследовательном (или кажется?) изложении ... да и изложение то достаточно "на пальцах" по уровню ...

Аватара пользователя
Olej
Писатель
Сообщения: 15992
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Python

Непрочитанное сообщение Olej » 23 окт 2013, 12:57

Olej писал(а):- кроме того, этот GUI-фреймворк simplegui (пусть даже учебный) создаёт фиксированнное оконное изображение, фактически без внятного оконного компоновщика, что-то по типу того, что я на картинке нарисовал (это я своё "домашнее задание" по их мини-проекту №2 показал: "угадай число"):
Для конкретики, чтобы не быть голословным, вот мой код их мини-проекта в их ... макси-условиях ;-) (т.е. с их GUI-фреймворком в их среде его выполнения):

Код: Выделить всё

olej@notebook:~/2013_WORK/Python/Coursera/gn$ cat gn.py 
import random
import simplegui
import math

# initialize global variables used in your coden
val_range = 100
secret = 0
guesses = 0
limits = 7

# helper function to start and restart the game
def new_game():
    global secret, guesses, limits 
    print "\nNew game, range: [ 0...", val_range, ")"
    secret = random.randrange( 0,val_range ) 
    guesses = 0
    limits = int( math.ceil( math.log( val_range, 2 ) ) )

def range100():
    global val_range
    val_range = 100
    if guesses > 0 :
        print "... game over"
    new_game()
    
def range1000():
    global val_range
    val_range = 1000
    if guesses > 0 :
        print "... game over"
    new_game()
    
def input_guess( guess ):
    global guesses
    try :
        value = int( guess )
    except ValueError:
        print "Error: value must be integer!"
        return;
    guesses += 1
    if value < secret :
        print value, "- lower ..."
    elif value > secret :
        print value, "- higher ..."    
    else :
        print "Player wins!"
        new_game()
        return
    if guesses >= limits :        
        print "Computer wins! Secret number was", secret
        new_game()
        return
        
# create frame
frame = simplegui.create_frame("Guess the number", 200, 200)

# register event handlers for control elements
frame.add_button("New game", new_game)
frame.add_button("Range 0...100", range100)
frame.add_button("Range 0...1000", range1000)
inp = frame.add_input("Next value ...", input_guess, 40)

# call new_game and start frame
new_game()

# Start the frame animation
frame.start()

Аватара пользователя
Olej
Писатель
Сообщения: 15992
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Python

Непрочитанное сообщение Olej » 23 окт 2013, 13:52

Olej писал(а): Для конкретики, чтобы не быть голословным, вот мой код их мини-проекта в их ... макси-условиях ;-) (т.е. с их GUI-фреймворком в их среде его выполнения):
Любопытства ради я задался вопросом: "а какая трудоёмкость переписать это под использование стандартного GUI-фреймворка Tkinter из стандартной библиотеки модулей Python?".

... и предыдущей ночью я переписал тот же пример (с минимальными изменениями), потребовало это ~1.5 часа (с учётом того, что последний раз я "пересекался" с Tkinter больше 2-х мес. назад и то мельком - многое пришлось вспоминать и искать), получилось это так:

Код: Выделить всё

olej@notebook:~/2013_WORK/Python/GUI/Tkinter/Py3$ cat gnt.py 
#!/usr/bin/python3
# -*- coding: utf-8 -*-

import random
import math
try:
    from tkinter import *
except ImportError: 
    from Tkinter import *

# initialize global variables used in your coden
val_range = 100
secret = 0
guesses = 0
limits = 7

# helper function to start and restart the game
def new_game():
    global secret, guesses, limits 
    print( "\nNew game, range: [ 0...{} )".format( val_range ) )
    secret = random.randrange( 0,val_range ) 
    guesses = 0
    limits = int( math.ceil( math.log( val_range, 2 ) ) )

def new_range( high ):
    global val_range
    val_range = high
    if guesses > 0 :
        print( "... game over" )
    new_game()
    
def input_guess( event ):
    global guesses
    try :
        value = int( ent.get() )
    except ValueError:
        print( "Error: value must be integer!" )
        return;
    ent.delete( 0, END )
    guesses += 1
    if value < secret :
        print( "{} - lower ...".format( value ) )
    elif value > secret :
        print( "{} - higher ...".format( value ) )
    else :
        print( "Player wins!" )
        new_game()
        return
    if guesses >= limits :        
        print( "Computer wins! Secret number was {}".format( secret ) )
        new_game()
        return
        
root = Tk()
root.title( 'Угадай число!' )
root.geometry( '300x140' )
Label( root, text='Вводите следующее число...' ).pack( side=TOP )
but1 = Button( root, text='     Новая игра      ', command=new_game ).pack( side=BOTTOM )
but2 = Button( root, text='Диапазон 0...100 ', command=(lambda: new_range( 100 )) ).pack( side=BOTTOM )
but3 = Button( root, text='Диапазон 0...1000', command=(lambda: new_range( 1000 )) ).pack( side=BOTTOM )

ent = Entry( root, width=10 )
ent.pack( side=TOP ) 
ent.focus() # избавить от необходимости выполнять щелчок мышью по нажатию клавиши Enter
ent.bind( '<Return>', input_guess )

new_game()
root.mainloop()


Выглядит это так (как по мне, так куда приличнее сразу, чем их "учебный фреймворк", здесь сразу используется мощный Tkinter компоновщик виджетов):
Guess_number_004.png
Guess_number_004.png (9.29 КБ) 5916 просмотров
Новый вариант даже чуть короче старого (хотя это и не было целью)...
- было:

Код: Выделить всё

olej@notebook:~/2013_WORK/Python/Coursera/gn$ wc gn.py -l
69 gn.py
- стало:

Код: Выделить всё

olej@notebook:~/2013_WORK/Python/GUI/Tkinter/Py3$ wc -l gnt.py
68 gnt.py
Это при том, что в новом варианте добавлено:
- всегда сохранение фокуса ввода на поле ввода - не нужно постоянно мышкой щёлкать;
- кой-где добавлен для проверки русскоязычный текст ... + всё что для этого надо;
- код полностью переносим и исполним (одинаково!) и в Python 2 и в Python 3:

Код: Выделить всё

olej@notebook:~/2013_WORK/Python/GUI/Tkinter/Py3$ python gnt.py
New game, range: [ 0...100 )
...
olej@notebook:~/2013_WORK/Python/GUI/Tkinter/Py3$ python3 gnt.py
New game, range: [ 0...100 )
...
P.S. Совместимость даже при том, что имя модуля пишется в Python 2 - Tkinter, а в Python 3 - tkinter ... и это обходится.

P.P.S. При такой совместимости + минимальной трудоёмкости + на голову больших возможностях модуля Tkinter + то, что Tkinter, в отличие от "самопалок" не нужно: "сделал и забыл" ... :-o ... при этом всём совершенно необъясним выбор авторов курса.

Аватара пользователя
Olej
Писатель
Сообщения: 15992
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Python

Непрочитанное сообщение Olej » 23 окт 2013, 14:00

Olej писал(а):по их мини-проекту №2 показал: "угадай число"
Ну и протокол работы этой "угадайки", чтобы было понятно что и как оно делает (если кому будет интересно повторить и проверить):

Код: Выделить всё

olej@notebook:~/2013_WORK/Python/GUI/Tkinter/Py3$ ./gnt.py

New game, range: [ 0...100 )
12 - lower ...

New game, range: [ 0...100 )

New game, range: [ 0...1000 )
500 - lower ...
750 - lower ...
875 - lower ...
945 - lower ...
970 - higher ...
957 - lower ...
967 - higher ...
Player wins!

New game, range: [ 0...1000 )

New game, range: [ 0...1000 )

New game, range: [ 0...100 )
50 - higher ...
25 - lower ...
38 - higher ...
Player wins!

New game, range: [ 0...100 )
3 - lower ...

New game, range: [ 0...100 )
4 - lower ...
... game over

New game, range: [ 0...1000 )

и т.д.

Т.е.:
- генерится случайное число в диапазоне...
- пытаемся его угадать, руководствуясь результатами предыдущих сравнений: "меньше...", "больше..."
- сделать это нужно за ограниченное фиксированное число проб.
Эта задача где-то в учебниках неоднократно использовалась.

P.S. Протокол полностью идентичный что в 1-м, что во 2-м варианте.

Аватара пользователя
Olej
Писатель
Сообщения: 15992
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Python

Непрочитанное сообщение Olej » 19 ноя 2013, 18:06

Виктория писал(а):Спасибо, нашла. Курс пока один, от Романа Сузи.
Вот ещё любопытные учебные курсы (2012-2013) по Python: Список курсов.
Изображение

Ответить

Вернуться в «Инструменты программирования»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость