Python для начинающих. Является ли этот код Python настолько эффективным, насколько это возможно? - PullRequest
3 голосов
/ 14 февраля 2011

Этот вопрос / решение привело меня к другому связанному вопросу, задаваемому здесь - Помощь будет принята с благодарностью!

Обновлен текущий код ниже на основе первоначальной обратной связи

Я новичок в Python (это моя вторая программа).В настоящее время я использую Open Courseware от MIT, чтобы получить введение в CS с использованием Python Academic Earth videos , и я работаю над набором задач 1 Просмотреть можно здесь .Я создал эту программу, которая успешно воссоздает «Контрольный пример 1» в течение 12 месяцев (исключая раздел «результаты» ... все еще работаю над этим), но мой вопрос в том, насколько эффективен следующий (мой) код?Я чувствую, что повторяю это, когда в этом нет необходимости.:

Оригинальный код:

balance = float(raw_input("Outstanding Balance: "))
interestRate = float(raw_input("Interest Rate: "))
minPayRate = float(raw_input("Minimum Monthly Payment Rate: "))
interestPaid = round((interestRate/12.0)*balance, 2)
minPayment = round(minPayRate*balance, 2)
principalPaid = round(minPayment-interestPaid, 2)
remainingBalance = round(balance-principalPaid, 2)
month = 1

while month < 12 :    
    if month > 1 :
        balance = remainingBalance
    interestPaid = round((interestRate/12.0)*balance, 2)
    minPayment = round(minPayRate*balance, 2)
    principalPaid = round(minPayment-interestPaid, 2)
    remainingBalance = round(balance-principalPaid , 2)   
    month = month+1

    print 'Month: ' + str(month)
    print 'Minimum monthly payment: ' + str(minPayment)
    print 'Principle paid: ' + str(principalPaid)
    print 'Remaining balance: ' + str(remainingBalance)

Текущий код

balance = float(raw_input("Outstanding Balance: "))
interestRate = float(raw_input("Interest Rate: "))
minPayRate = float(raw_input("Minimum Monthly Payment Rate: "))

for month in xrange(1, 12+1):
    interestPaid = round(interestRate / 12.0 * balance, 2)
    minPayment = round(minPayRate * balance, 2)
    principalPaid = round(minPayment - interestPaid, 2)
    remainingBalance = round(balance - principalPaid, 2)

    print 'Month: %d' % (month,)
    print 'Minimum monthly payment: %.2f' % (minPayment,)
    print 'Principle paid: %.2f' % (principalPaid,)
    print 'Remaining balance: %.2f' % (remainingBalance,)

    balance = remainingBalance

Если вы видите что-то еще в этом новомкод, дайте мне знать!

Большое спасибо тем, кто помог мне получить это далеко.

Ответы [ 4 ]

4 голосов
/ 14 февраля 2011
print "x: " + str(x)

Должен быть заменен на:

print "x:", x

Это особый случай с печатью.


Измените цикл на:

for month in xrange(1, 12+1):

Отбросьте чек для первого цикла и просто установите баланс в Остальное Баланс в качестве конца.

Поскольку вы увеличиваете месяц вручную, вы печатаете неправильное значение каждый раз.


Если вы имеете в видуэффективность, как и эффективность выполнения, вы беспокоитесь об этом слишком рано .Если вы имеете в виду это, как в дублирующем коде, вы без необходимости дублируете математику перед циклом.В сочетании с вышесказанным:

balance = float(raw_input("Outstanding Balance: "))
interestRate = float(raw_input("Interest Rate: "))
minPayRate = float(raw_input("Minimum Monthly Payment Rate: "))

for month in xrange(1, 12+1):    
  interestPaid = round(interestRate / 12.0 * balance, 2)
  minPayment = round(minPayRate * balance, 2)
  principalPaid = round(minPayment - interestPaid, 2)
  remainingBalance = round(balance - principalPaid, 2)   

  print 'Month:', month
  print 'Minimum monthly payment:', minPayment
  print 'Principle paid:', principalPaid
  print 'Remaining balance:', remainingBalance

  balance = remainingBalance
4 голосов
/ 14 февраля 2011

Это не связано с какими-либо возможными проблемами эффективности *, но вам следует изучить модуль decimal, если вы занимаетесь финансовой арифметикой.В противном случае вы получите странные ошибки округления и представления .


*, точнее: это снизит эффективность, но повысит правильность вашего кода.

3 голосов
/ 14 февраля 2011

Вы должны использовать строковую интерполяцию или форматирование вместо перехода к str() и добавления.

print 'Month: %d' % (month,)
1 голос
/ 14 февраля 2011

Для оптимизации (скорости) в целом вы можете прочитать Анекдот по оптимизации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...