50万奖金+官方证书,深圳国际金融科技大赛正式启动,点击报名 了解详情
写点什么

用 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:042380

评论 1 条评论

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

Java 中 List 分片的 5 种方法!

王磊

Java List

架构实战营-模块2-作业

lucian

架构实战营

模块二作业

忘记喝水的猫

架构训练营

连续四年包揽第一!百度AI专利申请量、授权量再度领跑全国

百度大脑

人工智能 百度

第二模块作业

张靖

#架构实战营

架构实战营 - 模块二 - 微信朋友圈的高性能复杂度分析

dog_brother

架构实战营

微信朋友圈架构复杂度分析

Geek_nlp小咖

架构 微信朋友圈

模块二作业

panxiaochun

架构实战营

宣布Contour v1.13.0!!!

远鹏

golang Kubernetes cncf contour ingress-controller

坚守在技术无人区,一群无名英雄的低调与浪漫

脑极体

飞行汽车能顺利上天吗?

脑极体

模块二作业

莫离

架构实战营 「架构实战营」

文本序号添加/移除工具

入门小站

工具

云栖回顾|首届阿里云云原生生态合作伙伴大会:与伙伴能力融合,加速企业数字创新

阿里巴巴云原生

阿里云 云原生 生态 交流 合作伙伴

区块链技术重构文创产业 首个行业自律公约发布

CECBC

01 K8S之容器与容器编排系统

穿过生命散发芬芳

k8s 11月日更

架构设计第二周学习总结

周文

架构实战营 「架构实战营」

Serverless 工程实践|自建 Apache OpenWhisk 平台

阿里巴巴云原生

Apache 阿里云 开源 Serverless 云原生

架构训练营 - 模块2作业

焦龙

架构实战营

事务对系统影响(一)

卢卡多多

事务 11月日更

模块二作业

hhh

「架构实战营」

【LeetCode】分糖果Java 题解

Albert

算法 LeetCode 11月日更

OpenVINO+TF2环境搭建

IT蜗壳-Tango

11月日更

区块链用在房地产交易上 会怎样?

CECBC

linux之Ansible快速入门

入门小站

Linux

00后已经进入网易,下一步定位阿里,年轻人这么拼,android开发艺术探索电子

android 程序员 移动开发

架构班模块二作业

21°Char

飞桨中国行登陆鹏城 与当地企业共话AI赋能软硬件产品创新

百度大脑

人工智能 百度

极客时间 - 架构实战营 - 模块二作业

秋夫人

架构实战营

为面试加油助力,90个常见的Kubernetes面试题,值得收藏学习

奔着腾讯去

Docker Kubernetes 容器 云原生 Go 语言

降本增效利器之 Serverless

中原银行

Serverless 云原生 函数计算 中原银行

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