Применение компьютера

Алгоритм применения компьютера для решения физических задач

  1. Постановка задачи (математическая, геометрическая формулировка).
    1.1. исходные данные 2.2. требуемый результат
  2. Выбор и обоснование метода решения
    2.1. обзор возможных методов решения 2.2. выбор оптимального метода (критерии)
  3. Построение алгоритма
    3.1. анализ задачи (разбиение на последовательно решаемые подзадачи с описанием входных и выходных данных) 3.2. блок схема 3.3. определение параметров, регулирующих выполнение программы (шаг сетки и т.п.) 3.4. планируемая эффективность (быстродействие), пути повышения эффективности 3.5. планируемая точность, пути повышения точности 3.6. предполагаемые случаи неправильной работы (недопустимые значения параметров или входных данных)
  4. Написание программы (реализация алгоритма)
  5. Тестирование (тестовые примеры) 2-3 примера
    5.1. контрольные ответы 5.2. результат работы программы

Полезные кусочки кода

Таймер

Для контроля времени удобно использовать функцию time.clock() из модуля time.

  • Простой пример (запустить)
    from time import clock
    beg = clock()
    
    for i in range(10000):
        a=1
    
    print clock()-beg
    beg = clock()
    

Выполнение последних двух строк кода печатает время в секундах и перезапускает таймер.

  • Пример посложнее (запустить)
    from time import clock
    
    class my_time():
        
        def __init__(self):
            self.beg = clock()
    
        def __str__(self):
           st=str(clock()-self.beg)
           self.beg= clock()
           return st
    
        def __call__(self):
            t = clock()-self.beg
            self.beg += t
            return t
        
    
    timer=my_time()
    
    for i in range(10000):
        a=1
    
    print timer
    print timer()
    

Все оформляем в виде класса у которого beg - внутренняя переменная. Таймер можно просто печатать или вызывать в виде функции.

Построение графиков

Построение графиков осуществляется при помощи функций plot() из модуля pylab. Эта функция осуществляет размещение данных на графике. Показать график со всеми данными и передать управление на его окно можно через вызов функции show() из того же модуля. Интерактивное построение графика (без передачи управления на его окно) происходить после перехода в интерактивный режим (функция ion()) и размещения данных (функция draw()).

  • Простое посторение графика (запустить)

    from pylab import plot, show
    
    def func(x):
        return x*x
    
    a = 10
    b = 20
    n = 100
    dx = 1.*(b-a)/n
    
    x = [a+i*dx for i in range(n+1)]
    y = [func(i) for i in x]
    
    plot(x,y,'ro',lw=2)
    show()
            
    

Обратите внимание на обязательные выделенные строки. Поменяйте пределы построения графика (a, b), число точек разбиения (n), функцию (fun). Посмотрите результат.

  • Интерактивное посторение графика (запустить)

    from pylab import ion,plot, draw
    
    def func(x):
        return x*x
    
    a = 10
    b = 20
    n = 100
    dx = 1.*(b-a)/n
    
    x_set = [a+_*dx for _ in range(n+1)]
    
    ion()
    for x in x_set:
        plot(x,func(x),'go')
        draw()
            
    

Обратите внимание на обязательные выделенные строки. Ion() - переход в интерактивный режим. Каждая точка графика строится отдельно. Для вывода графика без передачи управления используется функция draw().

Запись и чтение текстового файла

Для доступа к данным файла создается файловый объект, который поддерживает операции чтения/записи строк.

  • Простой пример записи (запустить)
    # -*- coding: cp1251 -*-
    
    
    f=open('data.txt','w')     	  # Открываем файл для записи
    
    f.write('Header of the file \n')  # Заголовок файла
    f.write('Info      x      y \n')
    f.write('text of start line\n')  
    
    format_str =  'Data %f %f \n'     # Строка формата '%f' - число с плав. точкой
    				  # '\n' - конец строки
    
    for x in range(50):        	  #  
      st = format_str % (x,x**3)  	  # Подставляем данные в строку формата
      f.write(st)                     # Запись в файл
    
    f.write('text of end line\n')  
    
    f.close()                         # Закрываем файл для записи
    
  • Простой пример чтения с конвертированием данных (запустить)
    # -*- coding: cp1251 -*-
    
    f=open('data.txt','r')      # открываем файл 'data.txt' для чтения
    
    line = 1
    while line != '':           # пока не достигнут конец файла
        line=f.readline()       # читаем строки
    
        if line.find('start line') >= 0: # если нашли строку содержащую 
            data=[]                      # 'start line' начинаем запись
            line = f.readline()            
    
            while line.find('end line') < 0 or line =='': 
    	    # пока не нашли строку содержащую 'end line' читаем и сохраняем 
                data.append(line)	         
                line = f.readline()           
    
    f.close()		    # закрываем файл - убираем ссылку
    
    
    info = []
    for line in data:           # обрабатываем строки
        # разделяем строку, пропускаем первое слово и меняем формат     
        info.append([float(i) for i in line.split()[1:]]) 
    
    print info
    

Профайлинг

У Python есть профайлер, который называется cProfile. Он не только дает полное время выполнения, но также выдает время, затраченное на каждую функцию и количество вызовов функций. Результаты работы профайлера не требуют комментариев.

Можно импортировать его внутри кода или запустить его из интерпретатора:

import cProfile
cProfile.run('foo()')

Возможно более полезно использовать профайлер при запуске кода:

python -m cProfile [-o output_file] [-s sort_order] myscript.py

-o пишет результаты в файл вместо стандартного вывода

-s определяет один из sort_stats() условия для сортировки вывода. Это работает, когда -o не используется.

Можно создать новый испольняемый файл - команду „profile.bat“:

python -m cProfile %1

и запускать файлы питона через нее:

profile euler048.py