python - 使分数计算器代码更优化(更快和使用更少内存)的技巧

标签 python performance optimization

基本上,我需要程序做的是为单行输入充当一个简单的分数计算器(用于加法、减法、乘法和除法),例如:
-输入:1/7 + 3/5
-输出: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)

我将其简化为:

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))]))

欢迎就如何进一步改进提出任何建议。

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

最佳答案

可能您可以做出的最大改进是使用 Python (2.6) 的 fractions图书馆:

>>> import fractions
>>> fractions.Fraction(1,7) + fractions.Fraction("3/5")
Fraction(26, 35)

关于python - 使分数计算器代码更优化(更快和使用更少内存)的技巧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2985797/

相关文章:

python - 在 Python 中可视化 T 分布时遇到问题

java - 提高应用程序性能的方法

c# - 为什么绘制到 OnPaint 图形比图像图形更快?

c++ - 二维 CUDA 中值滤波器优化

mysql - 请求执行时间过长

python - 如何将包含多个字符串的 python 数组保存到人类可读的文件中

python - 当元素包含 numpy 数组时,无法测试 python 列表元素成员资格

python - 在 Python 中复制符号链接(symbolic link)

linux - 测量 TCP 连接延迟的工具

c - 优化线性矩阵的利润,用户可以跳过 1 或 2 个单元格