我有一个包含约50 k个自定义数据类型元素的列表(后者对我的问题可能不重要),我使用Python内置的list.sort()
方法对列表进行排序。
myList: List[Foo] = ...
myList.sort(key=Foo.x)
字符串
由于排序需要几分钟,我想有一个排序过程的进度条。我在网上找不到任何解决方案。
这可能吗我知道排序算法可能很复杂,而且可能根本无法衡量排序进度。不过,对我的usecase来说,有一个“粗略”的测量就可以了,比如25%,50%,75%...
我有一个包含约50 k个自定义数据类型元素的列表(后者对我的问题可能不重要),我使用Python内置的list.sort()
方法对列表进行排序。
myList: List[Foo] = ...
myList.sort(key=Foo.x)
字符串
由于排序需要几分钟,我想有一个排序过程的进度条。我在网上找不到任何解决方案。
这可能吗我知道排序算法可能很复杂,而且可能根本无法衡量排序进度。不过,对我的usecase来说,有一个“粗略”的测量就可以了,比如25%,50%,75%...
3条答案
按热度按时间quhf5bfb1#
考虑到
sort
提供的接口,您没有太多的选项来挂接实际的排序算法。但是,如果50K键很慢,则很可能调用key
函数很慢,这是在实际排序之前计算的。从文档:
对应于列表中每个项的键只计算一次,然后用于整个排序过程。
因此,如果你计算
key
方法被调用的次数,你就可以得到整个排序过程的粗略估计。为此,您可以为key
函数创建一个 Package 器来管理此簿记:字符串
使用一些虚拟数据和慢速键方法的示例
的数据
然后,可以将此方法与您希望用于更新状态的任何类型的库相结合。您可能希望进一步配置提供给所提供的钩子的数据,但是,原理是相同的。
下面是一个使用
tqdm
的示例:zkure5ic2#
我还假设关键字确定是排序中较慢的部分,这是一个相对较小的列表大小(50k)所期望的。这个答案的解决方案是制作一个中间列表,只包含键和对象引用。这可以被量化,并且在确定每个对象的密钥之后可以显示进展。对于这个演示,通过使用一个具有100ms睡眠的关键例程,这一过程变得很慢。
最后,真实的的排序将有望能够非常快地运行,因为密钥都已经被预先计算好了。
字符串
退货
型
出于某种原因,如果对预先计算的键的实际排序很慢,那么你可以将列表划分为更小的列表,然后诉诸于一个更大的列表,但这有点混乱,所以我想了解是否有必要。希望显着的缓慢是在关键一代。
svgewumm3#
是的,可以在Python中为排序过程创建进度条。正如您正确指出的那样,排序算法可能很复杂,并且在所有情况下精确测量进度可能并不可行。但是,正如您所建议的,可以通过使用排序键的 Package 类来粗略估计进度。
要实现这一点,可以创建一个 Package 类,该 Package 类保存原始排序键和有关进度的其他信息。 Package 器类将跟踪到目前为止比较的元素的数量以及所进行的比较的总数。根据这些信息,您可以估计进度。
以下是您如何实现这一点的基本概述:
字符串
现在,您可以使用
sort_with_progress
函数对列表进行排序并获得进度估计。请记住,这是一个粗略的估计,可能并不完全准确,特别是对于非常复杂的排序算法或非常大的数据集。然而,对于您的用例,它应该给予您一个足够好的排序进度指示。要将进度可视化为进度条,您可以创建一个简单的函数,以所需的格式打印进度:
型
这将打印一个进度条,该进度条会随着排序的进行而更新。当排序完成时,栏将完成。
请记住,确切的实现和行为可能取决于您的自定义数据类型
Foo
的细节以及排序算法在它上的执行情况,但是这个大纲应该为您提供一个构建进度条的起点。