写点什么

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

评论 1 条评论

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

区块链能否为应对气候变化 提供解决方案?

CECBC

Redis 缓存的三大问题及其解决方案

xcbeyond

redis 缓存 6月日更

整数划分问题(详解 n > m 情况)

若尘

数据结构 6月日更

Python——注释和字符串的拼接

在即

6月日更

Atlassian 最受欢迎的分析工具强势融入 Confluence Data Center!

Atlassian

DevOps 知识管理 Atlassian Jira Confluence

轮胎行业遇上AI,百度智能云携手固铂轮胎智能化转型

百度大脑

智能云 轮胎

自制文件系统 —— 02 开发者的福音,FUSE文件系统

奇伢云存储

Linux 文件系统 FUSE

【Redis】概览

awen

redis

【译】编写整洁 React 代码的简单实践

KooFE

大前端 React 6月日更 整洁代码

Bzz节点挖矿系统搭建,Bzz分币系统源码

Kubernetes手记(4)- 命令入门

雪雷

6月日更

相似度计算-句子

Qien Z.

nlp 6月日更 tf-idf

戴着镣铐起舞的算法市场

脑极体

如何使用Tauri和Ember.js创建小型、快速和酷的桌面应用程序

代码先生

tauri ember.js desktop程序

C语言从入门到精通(四)

代码情缘

编程 C语言 变量 编程之路 6月日更

工厂里三个质检车间缩减为一个,飞桨企业版EasyDL助力降本增效

百度大脑

飞桨

区块链+数字政务:成都高新区如何创新

CECBC

平衡计分卡- 战略落地的工具

石云升

创业 战略 职场经验 6月日更

理解IM消息“可靠性”和“一致性”问题,以及解决方案探讨

JackJiang

即时通讯 IM 可靠消息最终一致

C语言从入门到精通(三)

代码情缘

编程 开发 C语言 编程之路 硬件开发

架构训练营模块 5 作业 - 江哲

江哲

网络攻防学习笔记 Day38

穿过生命散发芬芳

网络攻防 6月日更

Sprint Review != Demo——《Scrum指南》重读有感(4)

Bruce Talk

Scrum 敏捷 随笔 Agile

5分钟速读之Rust权威指南(十八)

wzx

rust 范型 trait

Bzz节点分币系统搭建,Bzz矿机挖矿系统

2021全球人工智能技术大会开幕 百度王海峰:跨语言沟通正在成为现实

百度大脑

人工智能 沟通 跨语言

应用,才是区块链的终极归宿

CECBC

这个 “少年黑客”,用黑科技守护独居老人

阿里云CloudImagine

阿里云 计算机视觉 音视频 养老

JavaScript 代码逻辑判断的优化

编程三昧

JavaScript 大前端 代码质量 代码优化 编程思想

Java程序员【面试】与【进阶】3个最佳学习方法

Java架构师迁哥

C语言从入门到精通(二)

代码情缘

开发 C语言 编程、

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