time模块仅支持到0.001s如何解决
import timetimeofmusic = 0
def GetTime():
global timeofmusic
while True:
time.sleep(0.000001)
timeofmusic += 0.000001
timeofmusic = round(timeofmusic,6)
print(timeofmusic)
GetTime()
和
import time
timeofmusic = 0
def GetTime():
global timeofmusic
while True:
time.sleep(0.001)
timeofmusic += 0.000001
timeofmusic = round(timeofmusic,6)
print(timeofmusic)
GetTime()
的运行结果是一样的,做的程序需要精确至小数点后六位,请问该怎么办才可以使等待时间精度更高 最简单的办法:换一门语言 本帖最后由 永恒的蓝色梦想 于 2020-6-15 19:30 编辑
from time import time
from sys import stdout
begin=time()
while True:
stdout.write(f"{time()-begin:.6f}\n") 赚小钱 发表于 2020-6-15 19:24
最简单的办法:换一门语言
C 同样不支持。GoLang 支持嘛? 额,你是想要sleep精确到小数点后六位,还是说其他的
不好意思没怎么看懂你的题目
我觉得精确到这么小已经就不用在继续精确下去了,因为越精确对环境的要求越大,产生的误差也是一样的...
与每时每刻你的电脑运行状态还有很大的关系
赚小钱 发表于 2020-6-15 19:24
最简单的办法:换一门语言
LOL Twilight6 发表于 2020-6-15 19:32
我觉得精确到这么小已经就不用在继续精确下去了,因为越精确对环境的要求越大,产生的误差也是一样的.. ...
thx Twilight6 发表于 2020-6-15 19:32
我觉得精确到这么小已经就不用在继续精确下去了,因为越精确对环境的要求越大,产生的误差也是一样的.. ...
是sleep哈,抱歉没解释清楚{:10_277:} Twilight6 发表于 2020-6-15 19:32
我觉得精确到这么小已经就不用在继续精确下去了,因为越精确对环境的要求越大,产生的误差也是一样的.. ...
啊呀,回复错了 csyatfishc 发表于 2020-6-15 20:04
啊呀,回复错了
哈哈 没事,你回我三次了{:10_245:} 本帖最后由 赚小钱 于 2020-6-15 20:11 编辑
哎呀,看错了。原来是到毫秒级别。那 golang 妥妥的支持啊。我的垃圾 cpu 能到 18 微秒。
以下是原回复,懒得修改了。
永恒的蓝色梦想 发表于 2020-6-15 19:25
C 同样不支持。GoLang 支持嘛?
结果比较遗憾。时间精度达不到 μs 的级别。锁,系统调用的时间开销比较大。我去试一下 rust。
package main
import (
"fmt"
"time"
)
func main() {
var (
totalTime time.Duration
count int
)
c := make(chan time.Duration, 10)
go func() {
for i := 0; i < 10; i++ {
start := time.Now()
time.Sleep(time.Microsecond)
c <- time.Since(start)
}
close(c)
}()
for value := range c {
totalTime += value
count++
fmt.Printf("elapsed %s\n", value)
}
fmt.Printf("avg: %s\n", totalTime/time.Duration(count))
}
elapsed 31.615µs
elapsed 77.752µs
elapsed 14.408µs
elapsed 17.315µs
elapsed 6.637µs
elapsed 7.053µs
elapsed 5.847µs
elapsed 6.597µs
elapsed 6.563µs
elapsed 6.346µs
avg: 18.013µs
cpu 也不太行
processor : 3
vendor_id : AuthenticAMD
cpu family : 21
model : 96
model name : AMD Opteron(tm) X3421 APU
stepping : 1
microcode : 0x6006118
cpu MHz : 1563.177
cache size : 1024 KB
physical id : 0
siblings : 4
core id : 3
cpu cores : 2
apicid : 19
initial apicid: 3
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good acc_power nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs xop skinit wdt lwp fma4 tce nodeid_msr tbm topoext perfctr_core perfctr_nb bpext ptsc mwaitx cpb hw_pstate ssbd vmmcall fsgsbase bmi1 avx2 smep bmi2 xsaveopt arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif overflow_recov
bugs : fxsave_leak sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass
bogomips : 4192.27
TLB size : 1536 4K pages
clflush size : 64
cache_alignment : 64
address sizes : 48 bits physical, 48 bits virtual
power management: ts ttp tm 100mhzsteps hwpstate cpb eff_freq_ro acc_power 不知道是老师交代的任务,还是因为你里面有music,这个音频信号(44100次采样每秒)是超过千分之一精度的。如果你要做的是音频,这个只需要交给底层,他们会做的。老师应该大概率不会布置如此任务。 本帖最后由 赚小钱 于 2020-6-15 20:35 编辑
赚小钱 发表于 2020-6-15 20:07
哎呀,看错了。原来是到毫秒级别。那 golang 妥妥的支持啊。我的垃圾 cpu 能到 18 微秒。
以下是原回复 ...
Rust 就更惨了
use std::{thread, time};
fn main() {
(0..10).for_each(|_| {
let now = time::Instant::now();
let nanosecond = time::Duration::from_nanos(1);
thread::sleep(nanosecond);
let elapsed = now.elapsed();
println!("elapsed: {:?}", elapsed);
});
}
elapsed: 351.352µs
elapsed: 919.306µs
elapsed: 997.252µs
elapsed: 551.586µs
elapsed: 209.966µs
elapsed: 151.802µs
elapsed: 101.815µs
elapsed: 1.816756ms
elapsed: 1.056801ms
elapsed: 986.285µs
因为 rust 在库函数中调用的 libc,所以,与 c 的表现是一致的。而 golang 是自己实现的,所以精度更高。 赚小钱 发表于 2020-6-15 20:34
Rust 就更惨了
谢谢了,我还是老老实实用0.001s吧
页:
[1]