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 ...
随机推荐
- 性能瓶颈之Target
最常见的性能问题都发生在向目标数据库写数据的时候 常见的与目标数据库性能有关的问题有: 1) 数据库的checkpoint间隔太小 2) 数据库网络包太小 3) 在进行大批量数据加载时的问题 ...
- 如何开会——高效会议八项原则
引子 今天看到一段有趣的话,忍不住记录下来吧! 1. 任何事情只要能开会解决的,一定要开会解决,这多威风,多热闹啊. 2. 会前千万不要准备什么议程,这样开会就会惊喜多多,会议一定低效. 3. 会前千 ...
- Node.js 获取微信JS-SDK CONFIG
背景 前端在调用微信提供的分享.拍照.扫一扫等功能时需要到后台获取配置,主要是签名(signature).Node 开发可以用朴灵大佬的SDK--co-wechat-api. 配置 到微信公众平台进入 ...
- Dockerfile 时区设置
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime RUN echo 'Asia/Shanghai' >/etc/timezo ...
- 【原创】驱动枚举之QueryServiceStatus
BOOL WINAPI QueryServiceStatus( _In_ SC_HANDLE hService, _Out_ LPSERVICE_STATUS lpServiceStatus ); 函 ...
- php使用cURL上传图片
上传文件和POST非常相似,都是通过表单采取POST方法提交的. 先新建一个接收文件的页面upload.php: var_dump($_POST); var_dump($_FILES); 再建立一个发 ...
- 基于线程开发一个FTP服务器
一,项目题目:基于线程开发一个FTP服务器 二,项目要求: 基本要求: 1.用户加密认证 2.允许同时多用户登录 3.每个用户有自己的家目录 ,且只能访问自己的家目录 4.对用户进行磁盘配 ...
- 基于FineUIMVC的代码生成器(传统三层)v1.0-2
第一篇博客只是粗略说明了一下,其实这个工具真正用话可能大家还要细看下,我今天(连夜)写个例子,截几个图,做一下自定义模板的实例教程,因为代码生成本身是个工具,动画效果都是次要的,主要是工具本身,其中自 ...
- LeetCode每天一题之两数之和
这个LeetCode刷题系列的博客权当是为自己记一下笔记吧.博客系列会从LeetCode的第一题开始刷,同时会从零开始学习[因为我就是零/(ㄒoㄒ)/~~].同时,如果有写错的地方,希望大佬们在评论区 ...
- FMDB源码解析
上一篇博客讲述SQLite的使用,本篇将讲述FMDB源码,后面也会讲解SQLite在使用与FMDB的区别.本篇读下来大约20-30分钟,建议大家先收藏一下. FMDB是以OC方式封装SQLite中C语 ...