`

python 排序之Schwartzian转换

阅读更多

一、pthone 排序

 

1、[].sort 排序:

在Python里,可以使用`[].sort`实现默认的自然排序,其效率还不错。

2、自定义函数排序:

列表排序的顺序只是适用自然顺序,很多时候,你需要特定的顺序。比如需要排序的字段不是第一个字符,按照默认排序是毫无意义的。通过定义一个自定义函数返回-1则表示前者排在后者之前,返回0则表示二者顺序相同,返回1则表示后者排在前者之前,可以实现自己排序规则。 `cmp()`就是`[].sort()`的默认比较函数(在速度上'lst.sort()'远远超过'lst.sort(cmp)')。对于不太长的列表使用自定义比较函数可以快速的解决问题。

在很多情况下,甚至可以直接使用一个'lambda'表达式来完成任务。 说到速度,使用自定义比较函数效率会很低。部分原因是Python的函数调用开销,函数本身也会增加花费的时间。不过有一种技术“Schwartzian转换”可以加速这种自定义排序。

 

二、Schwartzian转换原理:

 

Schwartzian转换是兰德尔施瓦兹在Perl中最先开始使用的,但其中的技巧同样适用于Python。 使用Schwartzian转换主要包括三个步骤,(准确的来说这是Guttman-Rosler转换(GRT),同样基于Schwartzian转换)

  •  将列表转换为可以用默认排序的列表。
  •  使用`[].sort()`排序。
  •  转回原先的格式。

核心是将需要排序的对象转为一个能进行自然排序的字符串,任务里排序时间是主要因素的话,使用这项技术将大大提高效率(唯一的限制就是转换花费的时间不会很多)

 

三、实例:

考虑一个真实的案例:

我们的网站每个关键页面的访问都会有Cookie Log进行记录,Cookie log记录了用户的真实IP,访问的URL,时间等用户访问信息,每个应用是通过vip技术负载均衡到后面的具体的应用里面,Cookie log是通过Apache的module进行记录,由于并发,日志写入是并不是有序的,我们现在需要安装访问时间排序,以方便分析日志。真实的一行记录如下:

 

 

46.72.70.123 - - - [12/Sep/2012:23:59:50 -0700] "GET /www.xxx.com tm?productId=593651545&rnd=134 5370HTTP/1.1" 200 2131 82269 "http://www.xxx.com/ite545.html" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1" - - "a=mt=1|ms=|mid=ru1012642554; b=W_signed=Y; c=-"–

 

为了简单我们只取出时间不分排序,假设文本文件如下格式:

 

12/Sep/2012:23:59:50
12/Sep/2012:23:59:50

 

考虑可以将12/Sep/2012:23:59:50 转换为 20120912235950 然后按照自然排序就好了。

 

代码如下:

 

import sys, string, time, datetime    
wrerr = sys.stderr.write        
 
def get_Time(str):
	print len(str) 
	print str
	time = datetime.datetime.strptime(str,'%d/%b/%Y:%H:%M:%S')
	return time.strftime("%Y%m%d%H%M%S")
lines = open(sys.argv[1]).readlines()        
start = time.time()      
for n in range(len(lines)):              
	lst = string.split(lines[n])          
	lines[n] = (get_Time(lines[n][:20]), lines[n])        
lines.sort()                          
for n in range(len(lines)):              
	lines[n] = lines[n][1]        
end = time.time()
wrerr("Schwartzian transform sort in %3.2f secs\n" % (end-start))      
open('time.schwartzian','w').writelines(lines) 

 

核心在于get_Time函数,讲时间转换为可以自然排序的字符串。。

上面真实的场景无非是在该函数的前面先将时间字符串获取,这个想必不难吧。。

 

参考

http://perl.plover.com/TPC/1998/Hardware-notes.html#Schwartzian_Transform

http://docs.python.org/2/faq/programming.html#i-want-to-do-a-complicated-sort-can-you-do-a-schwartzian-transform-in-python

 

本站支持 pay for your wishes

分享到:
评论

相关推荐

    python坐标转换程序

    python坐标转换程序

    Python 将DataFrame数据转换成元组 Python源码

    Python 将DataFrame数据转换成元组 Python源码Python 将DataFrame数据转换成元组 Python源码Python 将DataFrame数据转换成元组 Python源码Python 将DataFrame数据转换成元组 Python源码Python 将DataFrame数据转换成...

    Python - ico文件转换器 - 图片格式转图标

    Python ico文件转换器是一个简单的工具,可以将图像文件转换为 .ico 格式,以便在 Windows 操作系统中使用。这个工具可以帮助你轻松地将常见的图像格式(如 .jpg、.png、.bmp 等)转换为图标文件,当打包程序需要...

    Python RGB模式颜色转换器 Python源码

    Python RGB模式颜色转换器 Python源码Python RGB模式颜色转换器 Python源码Python RGB模式颜色转换器 Python源码Python RGB模式颜色转换器 Python源码Python RGB模式颜色转换器 Python源码Python RGB模式颜色转换器 ...

    python冒泡排序教学ppt

    青少年python学习

    python 声音识别,转换为文字。

    在Python编程环境中,声音识别并将其转换为文字是一项常见的任务,尤其在语音识别软件、智能助手和自动会议记录等场景中。本主题将深入探讨如何使用Python实现这一功能,主要涉及以下几个关键知识点: 1. **音频...

    python冒泡排序之自己动手.py

    python冒泡排序,适合python初学者

    0026. python 快速排序教程.md

    0026. python 快速排序教程.md 0026. python 快速排序教程.md 0026. python 快速排序教程.md 0026. python 快速排序教程.md 0026. python 快速排序教程.md 0026. python 快速排序教程.md 0026. python 快速排序教程....

    python 将excel表格转换为图表

    内容简介:使用python 将excel表格转换为图表,使用GUI界面进行操作,可转换成html网页文件,也可以在html页面保存表格为图片。 此代码文件内,包括了exe执行文件以及源码,可以在任何电脑上执行此exe文件,不需要...

    视频格式转换python代码

    Python作为一个功能强大的编程语言,结合相应的库,可以实现高效的视频格式转换。在这个案例中,我们关注的是使用Python将MP4视频格式转换为AVI视频格式。下面将详细讲解如何实现这一过程,并介绍涉及的关键知识点。...

    python 实现毫秒转换为时分秒

    在Python编程中,有时我们需要处理时间相关的数据,例如将毫秒转换为更易读的时分秒格式。这个任务在处理服务器返回的数据时尤其常见,因为服务器可能以毫秒为单位提供时间戳。本篇文章将深入探讨如何实现这一转换,...

    python读取文件转换为csv

    使用python语言读取txt文本,根据分隔符判断,进行数据转换。适用于一个文本需要根据某个字段分隔多个文件的情况

    Python3实现对列表按元组指定列进行排序的方法分析

    本文实例讲述了Python3实现对列表按元组指定列进行排序的方法。分享给大家供大家参考,具体如下: Python版本: python3.+ 运行环境: Mac OS IDE: pycharm Python内建的排序方法 1 排序方法介绍 Python中有2个...

    Python 算法 快速排序.py

    Python 算法 快速排序.py

    Python读取Las与转换为TXT.zip

    Python读取Las点云数据并转换为TXT代码,亲测可用 Python读取Las点云数据并转换为TXT代码,亲测可用 Python读取Las点云数据并转换为TXT代码,亲测可用 Python读取Las点云数据并转换为TXT代码,亲测可用 Python...

    python txt文本批量转换excel

    本主题涉及的是如何使用Python将大量的TXT文本文件转换成Excel格式,这在数据分析、日志处理或任何需要整理大量文本数据的场景中非常实用。以下是实现这一功能所需的知识点及详细解释: 1. **Python基础**:首先,...

    C语言字符串转换为Python字符串的方法

    C语言字符串转换为Python字符串的方法 C语言字符串转换为Python字符串是指将C语言中的字符串数据转换为Python中的字符串对象,以便在Python环境中使用。下面详细介绍了C语言字符串转换为Python字符串的方法。 使用...

    Python 排序容器类型排序列表、排序字典和排序集合.zip

    Python 排序容器Sorted Containers是一个 Apache2 许可的排序集合库,用纯 Python 编写,速度与 C 扩展一样快。Python 的标准库非常棒,直到您需要一个排序集合类型为止。许多人会证明,没有它,您也能走得很远,但...

    Python-Python排序容器类型SortedListSortedDict和SortedSet

    在Python编程语言中,有一组特别的容器类型,它们提供了排序功能,这使得在处理大量数据时更加方便和高效。这些容器包括SortedList、SortedDict和SortedSet,它们都属于Sorted Containers库的一部分。Sorted ...

    PDF转PPT工具python

    本篇文章将深入探讨如何使用Python进行PDF到PPT的转换,并介绍相关知识点。 首先,我们需要了解Python中的两个关键库:`PyPDF2`和`python-pptx`。`PyPDF2`是一个用于处理PDF文件的纯Python库,它可以读取PDF文件并...

Global site tag (gtag.js) - Google Analytics