【AICon】探索RAG 技术在实际应用中遇到的挑战及应对策略!AICon精华内容已上线73%>>> 了解详情
写点什么

用 Python 重写了 C 语言实现的 Solaris 命令,代码减少 90% 而性能提升 17 倍

  • 2019-11-11
  • 本文字数:688 字

    阅读完需:约 2 分钟

用 Python 重写了 C 语言实现的 Solaris 命令,代码减少90%而性能提升17倍

/usr/bin/listusers命令中,我修复了一个内存分配的错误,这个错误在该命令转为 64 位时会引起一些问题。在修复这个错误之后,我决定研究一下这段古老的 C 代码是否能在转换为 Python 实现后得到一些改进。



这段 C 代码大约有 800 行,但从 1988 年后就基本没有动过了,在编写这段代码的那个年代,用户数还相当少,很有可能用户信息是在/etc/passwd 这个本地文件中或者在小型的 NIS 服务器上。


经过一番研究后,我发现 listusers 的算法基本上就是一些简单的集合操作。listusers 命令不带参数,它只是把排好序的用户列表输出到域名服务里,命令后的-l 和-g 选项用来过滤用户和组所在的列表。


我用 Python3 重写了 listusers,代码行数几乎只有原来代码的 1/10——由于 Python 本身包含了集合操作,而 C 版本代码自己使用链表实现了集合操作。


但是 Python 应该会更慢一些吗?结果证明不是。实际上,在我的数据库里(数据库里包含超过 10 万的用户)测试,它反而快了 17 倍。而且,我还肯定,当 Python 版本知道命令使用了-l 和-g 选项做过滤时,它不会把整个域名服务内容同时放进内存里。


改成 Python 后,我发现之前一个长期存在的 bug 变得很容易修复,即 listusers 不能正确地扩展嵌套组的问题。之前用 C 代码编写时,并不存在嵌套组这个概念,但是,使用 LDAP,嵌套组就可以实现了。


改成 Python 后,我还发现这 100 行 Python3 版本的代码将会很容易向前维护——尽管我希望 listusers 不需要再有什么更新,因为它的原有代码都已历经了好几十年!


原文链接:


https://blogs.oracle.com/solaris/reimplementing-a-solaris-in-python-gained-17x-performance-improvement-from-c


2019-11-11 10:042055

评论 1 条评论

发布
用户头像
标题有点故意。不同背景不同时期写的东西,这样去比性能和代码行数就太缺乏科学精神。有点像你开着小货车一脚油门超过了一辆正常行驶的跑车,然后得出结论,你的车比跑车要快3倍的速度。
2019-11-11 13:13
回复
没有更多了
发现更多内容

【Java并发编程】面试必备之线程池

java金融

线程池

智慧警务平台搭建,大数据时代下的警务模式

t13823115967

大数据

智慧公安情报研判大数据系统分析平台搭建

t13823115967

智慧公安

AI技术在音视频领域的发展

anyRTC开发者

人工智能 ios android AI WebRTC

架构师训练营第六周总结

Geek_xq

如何给团队制定合理的季度绩效?

Alan

团队管理 绩效 七日更 28天写作

架构师训练营 1 期第 9 周:性能优化(三)

灵霄

极客大学架构师训练营

架构师训练营 1 期第 11 周:安全稳定 - 作业

灵霄

极客大学架构师训练营

像用户一样测试:不妨犯傻

QualityFocus

软件测试 体验 可用性 用户体验

架构师训练营 1 期第 10 周:模块分解 - 作业

灵霄

极客大学架构师训练营

架构师训练营 1 期第 12 周:数据应用(一) - 作业

灵霄

极客大学架构师训练营

IDEA插件:多线程文件下载插件开发

Silently9527

Java 多线程 idea插件 文件传输

一代版本一代神:利用Docker在Win10系统极速体验Django3.1真实异步(Async)任务

刘悦的技术博客

django python3.x 异步 异步任务

架构师训练营 1 期第 8 周:性能优化(二)- 作业

灵霄

极客大学架构师训练营

【Java并发编程】阿里最喜欢问的几道线程池的面试题?

java金融

Java 面试 线程池

架构师训练营第六周作业

Geek_xq

数字资产钱包系统开发及介绍

面试官:我问的是Java内存模型,你回答堆栈方法区干嘛?

Java鱼仔

Java 程序员 JMM 多线程 并发

架构师训练营 1 期第 13 周:数据应用(二) - 作业

灵霄

极客大学架构师训练营

生产环境全链路压测建设历程 22:FAQ 1&2

数列科技杨德华

全链路压测 七日更

即构低延迟直播产品L3,打造更优质的实时互动体验

ZEGO即构

咨询师的诱惑

escray

程序员 面试 面经

架构师训练营第五周”技术选型一“总结

随秋

极客大学架构师训练营

Devil Fruit恶魔果实APP系统软件开发

系统开发

网易有道 iOS二面经验分享

iOSer

ios 面试 网易

LeetCode题解:剑指 Offer 40. 最小的k个数,二叉堆,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

太平金科助力“开局之战”顺利启动,博睿数据“A+N”一体化解决方案全力护航

博睿数据

APM npm AIOPS

博睿数据支持腾讯云函数监控,Serverless时代已来临

博睿数据

Serverless APM 监控

京东将上线社区团购“京喜拼拼”:社区团购是否是一次泡沫大战

石头IT视角

也谈“中年焦虑”

程序员架构进阶

方法论 职业规划 中年危机

简明设计模式—创建型

2970

设计模式 Go 语言

用 Python 重写了 C 语言实现的 Solaris 命令,代码减少90%而性能提升17倍_编程语言_Darren Moffat_InfoQ精选文章