在Python 2中对10**6位数字进行有效排序

在Python 2中对10**6位数字进行有效排序,python,performance,python-2.7,long-integer,Python,Performance,Python 2.7,Long Integer,我使用long类型来存储数字,并使用普通的排序方法进行排序,但效率不够 我认为long(raw_input())花费的时间太长了 有人能想出一个有效的方法来解决这个问题吗 n = int(raw_input().strip()) unsorted = [] for i in xrange(n): term = long(raw_input()) unsorted.append(term) for i in sorted(unsorted): print i 既然你说这

我使用
long
类型来存储数字,并使用普通的排序方法进行排序,但效率不够

我认为
long(raw_input())
花费的时间太长了

有人能想出一个有效的方法来解决这个问题吗

n = int(raw_input().strip())
unsorted = []
for i in xrange(n):
    term = long(raw_input())
    unsorted.append(term)

for i in sorted(unsorted):
    print i

既然你说这是一个有竞争力的编程问题,那么这个解决方案就不会起作用,否则它就永远不会起作用,因为它需要太多的内存,在坏的情况下会崩溃。但在竞争性编程中,约束并不是那么多,它应该起作用

我们只添加了比较器,即决定两个对象之间比较的gtlt方法

class VeryBigNumber(object):
    def __init__(self,number_string):
        self.number = number_string


def __gt__(self,other):
    if len(self.number)>len(other.number):
        return True
    elif len(self.number)<len(other.number):
        return False

    for i in xrange(min(len(self.number),len(other.number))):
        if int(self.number[i])>int(other.number[i]):
            return True
        elif int(self.number[i])<int(other.number[i]):
            return False
    return False

def __eq__(self,other):
    return self.number == other.number

def __lt__(self,other):
    return not (self.__eq__(other) or self.__gt__(other))

arr = []
for i in xrange(n):
    arr.append(VeryBigNumber(raw_input().strip())

arr = sorted(arr)
for a in arr:
    print a.number,
类VeryBigNumber(对象):
def uuu init uuu(self,number_字符串):
self.number=number\u字符串
定义(自身、其他):
如果len(自身编号)>len(其他编号):
返回真值
elif len(自身编号)int(其他编号[i]):
返回真值

elif int(self.number[i])你有多少百万位数字?2*(10**5)是我需要排序的数字。如果你有足够的内存,那应该在一个链接中结束。我会/猜/你经历的大部分时间都花在文件I/o上。请发布代码(以及指向数据文件的链接,如果有的话),读者可以通过复制和粘贴来重现问题。这听起来像是您正在加载/必须存储在内存中的至少180 GB数据(开销为0)。这里有一个建议:执行外部合并排序。字符串排序和数字排序之间有区别。假设am排序31415,1,3,10为字符串,它将被排序为:1,10,331415(根据ASCII),而它应该是1,3,10,31415@AbhishekKhandelwal:如果你所有的数字都有相同的位数,那就是相同的。@AbhishekKhandelwal Yea!这就是为什么我添加了自己的比较器!。。我没有使用标准的字符串比较。但是,这也假设在一个时间点上没有不必要的零start@AbhishekJebaraj,但在你的比较器中,你无论如何都在把它们转换成整数,这会有什么不同吗?@AbhishekJebaraj感谢你的代码。但求解一个特定的输入集需要0.2秒,而该输入集是由给出的代码在0.1秒内求解的。正如Tommi Komulainen所说,sort()将比sorted更高效,但执行时间仍然是0.2秒