Simplest Python K-Way Merging Sort|最简单的Python k路归并排序
想做这个好长时间了,因为有一篇Dreamworks的论文《Coherent Out-of-Core Point-Based Global Illumination》提到了这个,一直没时间做,于是今天抽了十几分钟搞了一下,基于Python的,非常简单。由于基于点云的GI已经毫无疑问的不会使用了,所以Weta Digital的PantaRay和Dreamworks的这些方法都会直接宣布作废,权当一个过渡阶段(从REYES到纯RT)的折中方法了。
k是线程数目,n是每个线程处理的数字个数。可以直接替换为外部的IO访问代码,每一个线程读取外部待排序数据的索引,写出各自排序后的结果,主线程再来读取所有的文件做一次归并输出即可。这里用了Python的heapq,C++的话直接就是std::priority_queue,也非常方便。
import heapq
import random
import threading # k threads
k = # Generate n numbers for each thread to process.
n = def GenerateNumbers(a, b):
numbers = []
for i in xrange(n):
numbers.append(random.randint(a, b))
return numbers class SortingThread(threading.Thread):
def __init__(self):
super(SortingThread, self).__init__()
self.numbers = GenerateNumbers(, ) def run(self):
self.numbers.sort() if __name__ == '__main__':
# Parallel sort with multiple threads.
#
sortingThreads = []
for i in xrange(k):
sortingThreads.append(SortingThread())
for i in xrange(k):
sortingThreads[i].start()
for i in xrange(k):
sortingThreads[i].join()
print i , sortingThreads[i].numbers # Use heap to output the final sorted list.
# We fill the heap with several numbers firstly
#
theHeap = []
for i in xrange():
for t in xrange(len(sortingThreads)):
number = sortingThreads[t].numbers[i]
heapq.heappush(theHeap, number) sortedNumbers = [] # In the while loop, people may replace the code by reading file routines.
# Since IO is always the bottleneck, so single thread should be enough.
p =
while (len(theHeap) > ):
if p < len(sortingThreads[t].numbers):
for t in xrange(len(sortingThreads)):
number = sortingThreads[t].numbers[p]
heapq.heappush(theHeap, number)
p +=
sortedNumbers.append(heapq.heappop(theHeap)) # Done
print sortedNumbers
Simplest Python K-Way Merging Sort|最简单的Python k路归并排序的更多相关文章
- 【Python学习笔记三】一个简单的python爬虫
这里写爬虫用的requests插件 1.一般那3.x版本的python安装后都带有相应的安装文件,目录在python安装目录的Scripts中,如下: 2.将scripts的目录配置到环境变量pa ...
- python自学笔记(一)简单了解python
脚本解释型语言的内部机制 python先将脚本编译成字节码文件(pyc,pyo) python虚拟机解释并运行字节码文件 编译型语言的内部机制 先将源代码编译成机器码(机器能读懂的代码),生成可执行文 ...
- 完成一段简单的Python程序,使用函数实现用来判断输入数是偶数还是奇数
#!/bin/usr/env python#coding=utf-8'''完成一段简单的Python程序,使用函数实现用来判断偶数和奇数'''def number_deal(a): if a%2==0 ...
- 完成一段简单的Python程序,用于实现一个简单的加减乘除计算器功能
#!/bin/usr/env python#coding=utf-8'''完成一段简单的Python程序,用于实现一个简单的加减乘除计算器功能'''try: a=int(raw_input(" ...
- python 列表排序方法sort、sorted技巧篇
Python list内置sort()方法用来排序,也可以用python内置的全局sorted()方法来对可迭代的序列排序生成新的序列. 1)排序基础 简单的升序排序是非常容易的.只需要调用sorte ...
- 数据结构 - 归并排序(merging sort)
归并排序(merging sort): 包含2-路归并排序, 把数组拆分成两段, 使用递归, 将两个有序表合成一个新的有序表. 归并排序(merge sort)的时间复杂度是O(nlogn), 实际效 ...
- python中List的sort方法的用法
python列表排序 简单记一下python中List的sort方法(或者sorted内建函数)的用法. 关键字: python列表排序 python字典排序 sorted List的元素可以是各种东 ...
- 【转】python中List的sort方法(或者sorted内建函数)的用法
原始出处:http://gaopenghigh.iteye.com/blog/1483864 python列表排序 简单记一下python中List的sort方法(或者sorted内建函数)的用法. ...
- FZU 1919 -- K-way Merging sort(记忆化搜索)
题目链接 Problem Description As we all known, merge sort is an O(nlogn) comparison-based sorting algorit ...
随机推荐
- 简介 - SAFe(Scaled Agile Framework,规模化敏捷框架)
简介 SAFe(Scaled Agile Framework,规模化敏捷框架) SAFe:https://www.scaledagileframework.com/ Scaled Agile Fram ...
- 来,带你鸟瞰 Java 中4款常用的并发框架!
1. 为什么要写这篇文章 几年前 NoSQL 开始流行的时候,像其他团队一样,我们的团队也热衷于令人兴奋的新东西,并且计划替换一个应用程序的数据库. 但是,当深入实现细节时,我们想起了一位智者曾经说过 ...
- Python编程Day4——if判断、while循环、for循环
一.if判断 语法一: if条件: 代码块1 代码块2 代码块3 示例: sex='female' age=18 is_beautiful=True if sex =='female'and age& ...
- mysql 开发进阶篇系列 13 锁问题(关于表锁,死锁示例,锁等待设置)
一. 什么时候使用表锁 对于INNODB表,在绝大部分情况下都应该使用行锁.在个别特殊事务中,可以考虑使用表锁(建议). 1. 事务需要更新大部份或全部数据,表又比较大,默认的行锁不仅使这个事务执行效 ...
- leetcode — sort-colors
import java.util.Arrays; /** * Source : https://oj.leetcode.com/problems/sort-colors/ * * * Given an ...
- How Tomcat works — 二、tomcat启动(1)
主要介绍tomcat启动涉及到的一些接口和类. 目录 概述 tomcat包含的组件 server和service Lifecycle Container Connector 总结 概述 tomcat作 ...
- Tomcat8源码笔记(九)组件StandardContext启动流程--未完待续
StandardContext代表的是webapps下项目,一个项目就是一个StandardContext,作为Tomcat组件的一部分,就会实现Lifecycle接口,被Tomcat管理着生命周期, ...
- 【SqlServer系列】远程访问
1 概述 已发布[SqlServer系列]文章如下: [SqlServer系列]SQLSERVER安装教程 [SqlServer系列]数据库三大范式 [SqlServer系列]表单查询 [SqlS ...
- Jenkins入门之新建任务
简单了解了Jenkins界面之后,下面我们简单介绍一下如何使用jenkins创建一个任务.打开Jenkins web管理界面之后,点击左侧最上方的NewItem图标 便会进入如下界面 产生要输入一个构 ...
- Perl处理数据(一):s替换、split和join
s替换 m//模式用来匹配文本,也就是说用来找数据.而s///用来查找并替换文本,所以可以用来处理文本文件.在有了正则的基础之后,s///用起来会简单很多. 用法格式为: $str =~ s/reg/ ...