csyatfishc 发表于 2020-6-15 19:10:19

time模块仅支持到0.001s如何解决

import time
timeofmusic = 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:24:47

最简单的办法:换一门语言

永恒的蓝色梦想 发表于 2020-6-15 19:25:22

本帖最后由 永恒的蓝色梦想 于 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:25:46

赚小钱 发表于 2020-6-15 19:24
最简单的办法:换一门语言

C 同样不支持。GoLang 支持嘛?

1223253411 发表于 2020-6-15 19:25:48

额,你是想要sleep精确到小数点后六位,还是说其他的

不好意思没怎么看懂你的题目

Twilight6 发表于 2020-6-15 19:32:59



我觉得精确到这么小已经就不用在继续精确下去了,因为越精确对环境的要求越大,产生的误差也是一样的...

与每时每刻你的电脑运行状态还有很大的关系

csyatfishc 发表于 2020-6-15 20:03:04

赚小钱 发表于 2020-6-15 19:24
最简单的办法:换一门语言

LOL

csyatfishc 发表于 2020-6-15 20:03:35

Twilight6 发表于 2020-6-15 19:32
我觉得精确到这么小已经就不用在继续精确下去了,因为越精确对环境的要求越大,产生的误差也是一样的.. ...

thx

csyatfishc 发表于 2020-6-15 20:04:24

Twilight6 发表于 2020-6-15 19:32
我觉得精确到这么小已经就不用在继续精确下去了,因为越精确对环境的要求越大,产生的误差也是一样的.. ...

是sleep哈,抱歉没解释清楚{:10_277:}

csyatfishc 发表于 2020-6-15 20:04:55

Twilight6 发表于 2020-6-15 19:32
我觉得精确到这么小已经就不用在继续精确下去了,因为越精确对环境的要求越大,产生的误差也是一样的.. ...

啊呀,回复错了

Twilight6 发表于 2020-6-15 20:06:24

csyatfishc 发表于 2020-6-15 20:04
啊呀,回复错了

哈哈 没事,你回我三次了{:10_245:}

赚小钱 发表于 2020-6-15 20:07:27

本帖最后由 赚小钱 于 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&micro;s
elapsed 77.752&micro;s
elapsed 14.408&micro;s
elapsed 17.315&micro;s
elapsed 6.637&micro;s
elapsed 7.053&micro;s
elapsed 5.847&micro;s
elapsed 6.597&micro;s
elapsed 6.563&micro;s
elapsed 6.346&micro;s
avg: 18.013&micro;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

java2python 发表于 2020-6-15 20:08:45

不知道是老师交代的任务,还是因为你里面有music,这个音频信号(44100次采样每秒)是超过千分之一精度的。如果你要做的是音频,这个只需要交给底层,他们会做的。老师应该大概率不会布置如此任务。

赚小钱 发表于 2020-6-15 20:34:09

本帖最后由 赚小钱 于 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&micro;s
elapsed: 919.306&micro;s
elapsed: 997.252&micro;s
elapsed: 551.586&micro;s
elapsed: 209.966&micro;s
elapsed: 151.802&micro;s
elapsed: 101.815&micro;s
elapsed: 1.816756ms
elapsed: 1.056801ms
elapsed: 986.285&micro;s

因为 rust 在库函数中调用的 libc,所以,与 c 的表现是一致的。而 golang 是自己实现的,所以精度更高。

csyatfishc 发表于 2020-6-15 20:39:38

赚小钱 发表于 2020-6-15 20:34
Rust 就更惨了




谢谢了,我还是老老实实用0.001s吧
页: [1]
查看完整版本: time模块仅支持到0.001s如何解决