Python 如何计算在最后一秒钟内下载了多少数据?(FTP)

Python 如何计算在最后一秒钟内下载了多少数据?(FTP),python,python-3.x,download,ftp,ftplib,Python,Python 3.x,Download,Ftp,Ftplib,我想知道在过去1秒钟内下载了多少数据。 我还没有代码,但我想知道我应该什么时候开始计算这1秒,以及如何计算。 我应该在retrbinary()之前还是之后开始计数?还是我完全错了 首先,传输进度显示有现成的实现,包括传输速度 例如,progressbar2模块。看 progressbar2默认显示自下载开始以来的平均传输速度 但请注意,速度显示器通常不会显示这种速度。它们显示过去几秒钟的平均速度。这使得价值更具信息性。progressbar2对此有自己的看法。但是它 如果您想自己实现计算,并且

我想知道在过去1秒钟内下载了多少数据。
我还没有代码,但我想知道我应该什么时候开始计算这1秒,以及如何计算。

我应该在
retrbinary()之前还是之后开始计数?还是我完全错了

首先,传输进度显示有现成的实现,包括传输速度

例如,progressbar2模块。看

progressbar2默认显示自下载开始以来的平均传输速度

但请注意,速度显示器通常不会显示这种速度。它们显示过去几秒钟的平均速度。这使得价值更具信息性。progressbar2对此有自己的看法。但是它


如果您想自己实现计算,并且对下载开始后的简单平均传输速度感到满意,那么很容易:

from ftplib import FTP
import time
import sys
import datetime

ftp = FTP(host, user, passwd)

print("Downloading")
total_length = 0
start_time = datetime.datetime.now()

def write(data):
   f.write(data)
   global total_length
   global start_time
   total_length += sys.getsizeof(data)
   elapsed = (datetime.datetime.now() - start_time)
   speed = (total_length / elapsed.total_seconds())
   print("\rElapsed: {0} Speed: {1:.2f} kB/s".format(str(elapsed), speed / 1024), end="")

f = open('file.dat', 'wb')
ftp.retrbinary("RETR /file.dat", write)
f.close()

print()
print("done")    

计算最后几秒钟的平均速度要困难得多。您必须记住过去传输的数据量。从
AdaptiveTransferSpeed
中窃取(并修复)代码,您将得到如下结果:

sample_times = []
sample_values = []
INTERVAL = datetime.timedelta(milliseconds=100)
last_update_time = None
samples=datetime.timedelta(seconds=2)
total_length = 0

def write(data):
   f.write(data)

   global total_length

   total_length += sys.getsizeof(data)
   elapsed = (datetime.datetime.now() - start_time)

   if sample_times:
       sample_time = sample_times[-1]
   else:
       sample_time = datetime.datetime.min

   t = datetime.datetime.now()
   if t - sample_time > INTERVAL:
       # Add a sample but limit the size to `num_samples`
       sample_times.append(t)
       sample_values.append(total_length)

       minimum_time = t - samples
       minimum_value = sample_values[-1]
       while (sample_times[2:] and
              minimum_time > sample_times[1] and
              minimum_value > sample_values[1]):
           sample_times.pop(0)
           sample_values.pop(0)

   delta_time = sample_times[-1] - sample_times[0]
   delta_value = sample_values[-1] - sample_values[0]
   if delta_time:
       speed = (delta_value / delta_time.total_seconds())

       print("\rElapsed: {0} Speed: {1:.2f} kB/s".format(
           str(elapsed), speed / 1024), end="")

ftp.retrbinary("RETR /medium.dat", write)

你能把代码放在下载文件的地方吗?通常你有一个循环,可以读取
x
字节数的数据,只需检查每次迭代(或十次或其他)所需的时间,然后进行计算。我假设您实际上想要实现的是一个传输速度显示。@Artog那么这个循环是如何工作的呢?假设我有一行代码:
ftp.retrbinary('RETR'+readme.txt,8192)
我在哪里循环通过
x
字节数@MartinPrikryl和是的,我想实现传输速度显示。等等,什么是即时速度?您的代码正在运行,但我不明白什么是“即时速度”。我的目标是创建一个传输速度显示,比如当你在Steam上下载游戏或在Chrome上下载文件时,它会显示当前的下载速度。这是即时速度还是平均传输速度?代码计算自启动后下载的字节数/自启动后的秒数
。我不知道Steam算法是什么,但我相信大多数速度显示器的显示方式类似于
字节下载时间最后一秒/X
X
大约为2-5秒。默认情况下,from使用
X=2
。如果它显示自启动以来下载的
字节/自启动以来的秒数
,那么当我下载102 MB文件时,为什么它显示下载的3500 kB?我不明白。我的代码显示的是
kB/s
的速度,而不是
kB
中下载的字节数。我的代码也显示了,但你说的是从开始以来下载的
字节数。它在我的控制台中也显示了
kB/s
,但正如您所说,这些是从一开始就下载的字节吗?