前一段时间看了一篇关于rust加速python的文章,讲述到利用rust的特性去加速python的执行效率。在一些网上,这类的资料比较少。加上rust在生态上还没形成良好的环境,不过它的性能足够强悍可以让人感觉到它的强大之处。实际上,python在很多案例中,包括一些著名的库也会使用C 或C++去优化执行效率。例如numpy就借用C语言去发挥性能极高的计算。
在一些日常比较中,常见的包括网上很多就是进行叠加计算,测试python和rust的效率。实际上这种比较意义不大。下面,我们也重复一次实验过程。
第一次执行10万次的计算
def testTime():
t1 = time.time()
sum = 0
for i in range(100000):
sum += 1
print(f"执行时间为:{time.time() - t1}")
testTime()
#执行时间为:0.0060007572174072266
在10万次下会产生一些消耗。
执行的时间耗时:0.0060007572174072266
第二次执行100万次计算
def testTime():
t1 = time.time()
sum = 0
for i in range(1000000):
sum += 1
print(f"执行时间为:{time.time() - t1}")
testTime()
#执行时间为:0.05700254440307617
在100万次下会产生一些消耗。
执行的时间耗时:0.05700254440307617
第三次执行1000万次计算
def testTime():
t1 = time.time()
sum = 0
for i in range(10000000):
sum += 1
print(f"执行时间为:{time.time() - t1}")
testTime()
#执行时间为:0.7147984504699707
在1000万次下会产生一些消耗。
执行的时间耗时:0.7147984504699707
第四次执行1亿次计算
def testTime():
t1 = time.time()
sum = 0
for i in range(100000000):
sum += 1
print(f"执行时间为:{time.time() - t1}")
testTime()
#执行时间为:6.718158960342407
在1亿次下会产生一些消耗。
执行的时间耗时:6.718158960342407
从实验计算来讲。在1亿次计算量会比较明显产生的消耗会大很多。在10w次的计算,消耗量并不是很明显。
采用rust去算出一个数据出来,这次从1000w开始
use std::time::{Instant};
fn main() {
let start = Instant::now();
let mut sum = 0;
for _ in 0..100000000{
sum +=1;
}
let duration = start.elapsed();
println!("{}",sum);
println!("执行时间为: {:?}", duration);
执行时间为: 343.7971ms(微秒)
转换为秒为:0.0003438
同等对比python在这个档位 :0.7147984504699707
再次执行一亿次计算
rust的时间为:
执行时间为: 3.7116033s
在大计算的时候,rust优势会明显一点。
如果采取不是编译出的exe执行的话,rust的效率会更高。经过python去调取的rust方法的时候,效率会让人快到怀疑人生。但这也是其中一种优势加速。只是在众多测试过程,上了百万和千万到亿级别的计算。rust的优势会凸显出来,在日常使用过程,这种差别会变得很小。在密集型计算和io优化会带来一点灵感,提供一种优化的思路。在日常使用过程,python已经足够可以对付这样的计算。
rust 提供了一个提升的速度的方式,但并不是绝对化,毕竟再维护rust的过程,大多数库的依旧是c和c++天下,rust要在这块积累,还有一段漫长积累过程。不过,我依旧看好rust在今后的发展趋势。
安全和性能,这2点足够强悍。只是在书写和概念入门的门槛实在太大,可以劝退一大部分人。rust在python的使用优化,仅仅是一种手段。更多应用潜力在一些项目中使用到。这方面可以在招聘中反应到最佳的使用需求。
在IO的测试过程,同等文件读取和解析,rust在性能方面依旧会比python出色一点。但在书写代码方面,我个人依旧会喜欢python这种短平快的处理方式。rust在资料在使用上,还比较少,需要阅读大量的使用案例才能很好理解,所以在刚接触过程写起来会比较慢,新手流程并不是很好。
这种比较意义并不大,但是可以提供一种思路去优化在神经网络计算和一些密集计算的时候,采取一些包装去加速一些运算执行效率。