使分数计算器代码更优化的提示(更快,使用更少的内存)

Log*_*Joe 5 python optimization performance

基本上,我需要的程序是为单行输入操作一个简单的分数计算器(加法,减法,乘法和除法),例如:
-input:1/7 + 3/5
-output:26/35

我的初始代码:

import sys

def euclid(numA, numB):
    while numB != 0:
        numRem = numA % numB
        numA = numB
        numB = numRem
    return numA

for wejscie in sys.stdin:
    wyjscie = wejscie.split(' ')
    a, b = [int(x) for x in wyjscie[0].split("/")]
    c, d = [int(x) for x in wyjscie[2].split("/")]
    if wyjscie[1] == '+':
        licz = a * d + b * c
        mian= b * d
        nwd = euclid(licz, mian)
        konA = licz/nwd
        konB = mian/nwd
        wynik = str(konA) + '/' + str(konB)
        print(wynik)
    elif wyjscie[1] == '-':
        licz= a * d - b * c
        mian= b * d
        nwd = euclid(licz, mian)
        konA = licz/nwd
        konB = mian/nwd
        wynik = str(konA) + '/' + str(konB)
        print(wynik)
    elif wyjscie[1] == '*':
        licz= a * c
        mian= b * d
        nwd = euclid(licz, mian)
        konA = licz/nwd
        konB = mian/nwd
        wynik = str(konA) + '/' + str(konB)
        print(wynik)
    else:
        licz= a * d
        mian= b * c
        nwd = euclid(licz, mian)
        konA = licz/nwd
        konB = mian/nwd
        wynik = str(konA) + '/' + str(konB)
        print(wynik)
Run Code Online (Sandbox Code Playgroud)

我减少到:

import sys

def euclid(numA, numB):
    while numB != 0:
        numRem = numA % numB
        numA = numB
        numB = numRem
    return numA

for wejscie in sys.stdin:
    wyjscie = wejscie.split(' ')
    a, b = [int(x) for x in wyjscie[0].split("/")]
    c, d = [int(x) for x in wyjscie[2].split("/")]
    if wyjscie[1] == '+':
        print("/".join([str((a * d + b * c)/euclid(a * d + b * c, b * d)),str((b * d)/euclid(a * d + b * c, b * d))]))
    elif wyjscie[1] == '-':
        print("/".join([str((a * d - b * c)/euclid(a * d - b * c, b * d)),str((b * d)/euclid(a * d - b * c, b * d))]))
    elif wyjscie[1] == '*':
        print("/".join([str((a * c)/euclid(a * c, b * d)),str((b * d)/euclid(a * c, b * d))]))
    else:
        print("/".join([str((a * d)/euclid(a * d, b * c)),str((b * c)/euclid(a * d, b * c))]))
Run Code Online (Sandbox Code Playgroud)

如何改进这个进一步的建议是值得欢迎的.

编辑:我忘了提到的另一件事 - 代码不能使用除sys之外的任何库.

Mar*_*off 9

您可以做的最大改进可能是使用Python(2.6)的fractions库:

>>> import fractions
>>> fractions.Fraction(1,7) + fractions.Fraction("3/5")
Fraction(26, 35)
Run Code Online (Sandbox Code Playgroud)

  • 这可能会完成工作,如果不是因为事实(忘记提及 - 抱歉!)我不能使用除sys之外的任何库. (3认同)

Dan*_*ach 5

我想创建一个包含一个类numeratordenominator领域(包括整数)和实施__add__,__sub__,__mul__,和__div__方法.然后,您可以简单地使用普通的数学函数来组合实例.

对于您的目的而言可能有点过分,但代码会更清晰.

实际上,基于类的方法正是fractions模块的实现方式.通常我建议检查分数模块的源代码,看它是如何写的,但由于这是作业,我不确定是否允许.在分配结束后可能值得检查,只是为了看看如何实现完整的小数字类型.