【问题标题】:Translating Python to C++: lists and tuples将 Python 翻译成 C++:列表和元组
【发布时间】:2013-01-24 01:44:38
【问题描述】:

为了提高速度,我目前正在将一段 Python 代码翻译成 C++。 这是代码(注意,qsort 是我自己编写的快速排序):

base = sys.stdin.readline().split()
n = int(base[0])
m = int(base[1])
mult = m * 10
count = 1
output = []

while count != (n+1):

    hold = output + []
    if (n - count) + 1 >= mult:
        rev = mult
    else:
        rev = n - count + 1

    while rev != 0:
        temp = sys.stdin.readline().split()
        hold.append((int(temp[0])*count,temp[1], count))
        count += 1
        rev -= 1

    hold = qSort(hold,len(hold))
    output = hold[:m]

本质上,我将几行输入添加到一个名为 hold 的临时列表中,该列表包含新项目和现有输出,然后我的快速排序根据项目的值对项目进行排序(作为第一个元素/integer 在附加的元组中)。在 Python 中,这个过程非常简单,因为我只是保留一个元组列表作为保持和输出,每个元组包含三个项目:(1)用于排序的整数,(2)字符串,(3)整数。 我想知道将其转换为 C++ 的最佳方法是什么。我应该维护 3 个单独的数组并同时更新所有数组,还是应该使用列表和元组类。 (我试图让我的代码尽可能快地运行)。此外,在决定使用方法后,如何最好地转换保持和输出之间的相互作用?如何在循环开始时不断有效地刷新保持并在结束时有效地修改输出?

非常感谢任何和所有帮助!干杯,伙计们!

【问题讨论】:

  • Python 内置了非常出色的排序功能。我很好奇你为什么写自己的......也许是某种学习练习?
  • 能否将 cmets 添加到您的 Python 代码中?我发现很难跟上。 m、n 和 rev 是什么?
  • steveha,我是新手,甚至没有意识到这一点!你是救世主!

标签: c++ python performance translation tuples


【解决方案1】:

应该可以重写您的 Python 以使其足够快。

首先,将所有输入收集到一个列表中。

其次,使用list.sort()方法函数对列表进行排序,用key=参数按数字排序。

你自己的排序函数会比 Python 内置的排序慢。而且我不清楚代码在做什么,但它似乎不止一次调用 sort 函数(外部 while 循环每个循环运行一次 sort 函数)。按照我的建议重写,应该很快。

编辑:这段代码和你的原始代码做的事情大致相同吗?

from operator import itemgetter
import sys

with sys.stdin as f:
    base = f.readline().split()
    n = int(base[0])
    m = int(base[1])

    hold = []
    for i, line in enumerate(f, 1):
        lst = line.split()
        weight = int(lst[0]) * i
        tup = (weight, lst[1], i)
        hold.append(tup)

hold.sort(key=itemgetter(0))
output = hold[:m]

for tup in output:
    print(tup[1])

【讨论】:

    【解决方案2】:

    我对 python 不是很熟悉,也不能确切地告诉你要做什么,但这是我建议的路径。创建一个类或结构来保存在元组中找到的数据(三个成员:int、int、string)。创建一个将保存您的结构的向量,然后使用包含从输入文件中读取的数据的结构填充此向量。最后,使用自定义排序函数对此向量调用排序。实现与this question 非常相似,但我将在此处为您提供概述。

    你的结构可能是这样的

    struct mystruct{
      int int1;
      int int2;
      string str1;
      public mystruct(int i1, int i2, string s1){int1 = i1; int2 = i2; str1 = s1;}
    }
    

    你的向量会这样定义

    vector<mystruct> myvector;
    

    您将使用类似于此的代码加载您的矢量

    mystruct ms(1,1,"text");
    myvector.push_back(ms);
    

    你必须定义一个排序函数来比较你的结构的两个实例

    bool compareStructs(mystruct i,mystruct j) { return (i.int1<j.int1); }
    

    然后使用 std::sort 对你的向量进行排序

    std::sort(myvector.begin(),myvector.end(),compareStructs);
    

    【讨论】:

    • 非常感谢。雇用自己的班级会花费额外的时间吗?我试图尽可能快地做到这一点
    • 用户:听起来你在过早地优化,没有对其进行分析。通过一些调整,这在 python 中应该很快。否则在 C++ 中创建一个类的实例不会减慢它的速度。
    • Monkey,您对如何使这个 python 代码更快有什么建议吗?另外,什么是 C++ 的好分析器?
    • 另外,ryanbwork,你对我如何翻译有什么建议吗:
    猜你喜欢
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    相关资源
    最近更新 更多