使用任何类型的并行化,等待多个时间段,总睡眠时间至少为1分钟(但小于1.5分钟)。
程序/函数必须在10秒内终止,并返回(以任何方式和任何格式)两个值:总运行时间和执行的总睡眠时间。这两个时间值都必须具有至少0.1秒的精度。
这类似于工时的概念:如果10名工人分开工作,60小时的工作可以在6小时内完成。在这里,我们可以有60秒的睡眠时间,例如在10个并行线程中,因此完成整个任务只需要6秒。
程序MyProgram创建14个线程,每个线程休眠5秒:
MyProgram→[5.016,70.105]
由于开销的原因,执行时间大于5秒,总睡眠时间大于70秒。
发布于 2016-06-16 09:33:24
import threading as H,time as T
m=T.time
z=H.Thread
s=m()
r=[]
def f():n=m();T.sleep(9);f.t+=m()-n
f.t=0
exec"r+=[z(None,f)];r[-1].start();"*8
map(z.join,r)
print m()-s,f.t这需要一个时间精度大于1秒的操作系统才能正常工作(换句话说,任何现代操作系统)。创建了8个线程,每个线程休眠9秒,导致实时运行时间为9秒,并行运行时为72秒。
尽管正式文件说应该使用关键字参数来调用Thread构造函数,但我还是要谨慎使用位置参数。第一个参数(group)必须是None,第二个参数是目标函数。
nneonneo在评论中指出,属性访问(例如f.t)比列表索引访问(例如t[0])更短。不幸的是,在大多数情况下,由于需要创建一个允许在运行时创建用户定义的属性的对象,执行此操作所获得的少量字节将丢失。幸运的是,函数在运行时支持用户定义的属性,因此我利用它节省了t属性f中的总时间。
在网上试试
感谢DenkerAffe的-5字节和exec技巧。
感谢kundor的-7字节,指出线程参数是不必要的。
感谢nneonneo从杂项改进到-7字节。
发布于 2016-06-16 17:22:25
\time -f%e bash -c 'for i in {1..8};{ \time -aoj -f%e sleep 8&};wait'
paste -sd+ j|bc强制使用time可执行文件而不是外壳内置文件,方法是以\作为前缀。
附加到文件j,该文件在开始时必须为空或不存在。
发布于 2016-06-16 15:04:25
package main
import(."fmt";."time");var m,t=60001,make(chan int,m);func main(){s:=Now();for i:=0;i<m;i++{go func(){Sleep(Millisecond);t<-0}()};c:=0;for i:=0;i<m;i++{c++};Print(Since(s),c)}输出(ms):160.9939ms,60001 (160 ms等待60.001秒)
https://codegolf.stackexchange.com/questions/83039
复制相似问题