1
5
不是新答案,只是新代码。 这就是imho在优秀代码和高效代码之间的一个很好的中间方法(在bash中尽可能高效,它很慢,它是一个shell…)
替代方案,不使用经典的计数器循环
两者的速度差不多。 修复方法与所有其他修复方法相同:
|
2
5
伊克斯!这将生成1000000个参数
顺便说一下,注意到美元符号的缺失。特别地,
|
3
5
使用shell生成这样的随机数并不是它设计的目的。在另一种语言(如fortran、perl或c)中,编写代码以从统一分布中生成随机数可能会更好。 在您的代码中,有一件事情非常慢,那就是从1..1e7生成一个数字序列,并将它们全部分配给一个变量。这很可能是浪费,但如果你想确定的话,你应该做个侧面介绍。AS chaos 指出,附加到文件中也可能是非常昂贵的! 在Python中,您可以这样做:
在我的笔记本上运行它需要大约10秒钟。将seq从1分配到1000000需要大约10秒,当您添加随机数生成时,脚本在同一台计算机上的生成时间超过3分钟。和你一样,我也很沮丧,我试着用剧本来加快速度。以下是我正在使用的代码的简短版本:
运行此程序大约需要5.3秒:
删除附加的文件并简单地将stdout重定向到单个文件将提供以下脚本:
运行这个大约需要半秒钟:
程序的缓慢运行至少部分是由于附加到该文件。奇怪的是,当我试图用for循环交换seq调用时,我没有注意到任何加速。 |
4
4
我想“>>$file”可能是您问题的根源。在我的系统上,您的脚本需要10秒钟来生成10000。如果我删除$file参数,只需使用stdout并将整个内容捕获到一个文件中,这需要一秒钟的时间。 $time./gen1.sh n1.txt 10000美元 生成10000人的列表。 列表生成。 实0.07.552 用户0m1.355s 系统0M1.886S $time./gen2.sh 10000>n2.txt 实0.806米 用户0.576 系统0.140秒 |
5
3
不知道这是不是整个故事,但是重新打开文件附加到它的每个名字是没有帮助的。在任何可以保持打开的文件句柄写入的上下文中执行整个操作都会有很大帮助。 |
6
2
(我有种感觉,你可能不喜欢这个答案,但从技术上讲,你没有指定答案必须留在bash中!:p) 在原型语言中快速开发某些东西,然后根据需要切换到另一种语言(通常是C语言)是很常见的。下面是一个非常类似的python程序,供您比较:
注: 只有将stdout用于“实际输出”而不是状态通知时,才允许此程序与其他程序并行运行,直接将数据从一个stdout管道传输到另一个stdin。(可以使用*nix中的特殊文件,但如果可以使用stdout,则更容易。)示例: $./rand_names.py 1000000 | sort -n -k2 > output_file 它应该足够快: $time ./rand_names.py 1000000 > /dev/null List generated. real 0m16.393s user 0m15.108s sys 0m0.171s |
7
2
在主循环中尝试此操作:
这将使
我同意这里其他人的观点:这必须是巴什吗? 编辑:添加混乱的建议以保持文件的打开,而不是为每个名称的附加打开。 |
Cute dog · 如何将文本与重新排序的图像相匹配? 1 年前 |
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
Rohan Mittal · 按dict值对dict排序 2 年前 |
Pikachu620 · 可以对事件列表进行排序吗? 2 年前 |
Saif · 排序时python如何决定何时调用比较器? 2 年前 |
tryingmybest09 · 设置出生日期排序不正确 2 年前 |