当前位置: 首页 > 面试题库 >

为什么泡菜比np.save花费更长的时间?

太叔俊侠
2023-03-14
问题内容

我想保存一个dict或数组。

我尝试与np.save和一起使用pickle,发现前者总是花费更少的时间。

我的实际数据要大得多,但在这里我仅展示一小段用于演示目的:

import numpy as np
#import numpy.array as array
import time
import pickle

b = {0: [np.array([0, 0, 0, 0])], 1: [np.array([1, 0, 0, 0]), np.array([0, 1, 0, 0]), np.array([0, 0, 1, 0]), np.array([0, 0, 0, 1]), np.array([-1,  0,  0,  0]), np.array([ 0, -1,  0,  0]), np.array([ 0,  0, -1,  0]), np.array([ 0,  0,  0, -1])], 2: [np.array([2, 0, 0, 0]), np.array([1, 1, 0, 0]), np.array([1, 0, 1, 0]), np.array([1, 0, 0, 1]), np.array([ 1, -1,  0,  0]), np.array([ 1,  0, -1,  0]), np.array([ 1,  0,  0, -1])], 3: [np.array([1, 0, 0, 0]), np.array([0, 1, 0, 0]), np.array([0, 0, 1, 0]), np.array([0, 0, 0, 1]), np.array([-1,  0,  0,  0]), np.array([ 0, -1,  0,  0]), np.array([ 0,  0, -1,  0]), np.array([ 0,  0,  0, -1])], 4: [np.array([2, 0, 0, 0]), np.array([1, 1, 0, 0]), np.array([1, 0, 1, 0]), np.array([1, 0, 0, 1]), np.array([ 1, -1,  0,  0]), np.array([ 1,  0, -1,  0]), np.array([ 1,  0,  0, -1])], 5: [np.array([0, 0, 0, 0])], 6: [np.array([1, 0, 0, 0]), np.array([0, 1, 0, 0]), np.array([0, 0, 1, 0]), np.array([0, 0, 0, 1]), np.array([-1,  0,  0,  0]), np.array([ 0, -1,  0,  0]), np.array([ 0,  0, -1,  0]), np.array([ 0,  0,  0, -1])], 2: [np.array([2, 0, 0, 0]), np.array([1, 1, 0, 0]), np.array([1, 0, 1, 0]), np.array([1, 0, 0, 1]), np.array([ 1, -1,  0,  0]), np.array([ 1,  0, -1,  0]), np.array([ 1,  0,  0, -1])], 7: [np.array([1, 0, 0, 0]), np.array([0, 1, 0, 0]), np.array([0, 0, 1, 0]), np.array([0, 0, 0, 1]), np.array([-1,  0,  0,  0]), np.array([ 0, -1,  0,  0]), np.array([ 0,  0, -1,  0]), np.array([ 0,  0,  0, -1])], 8: [np.array([2, 0, 0, 0]), np.array([1, 1, 0, 0]), np.array([1, 0, 1, 0]), np.array([1, 0, 0, 1]), np.array([ 1, -1,  0,  0]), np.array([ 1,  0, -1,  0]), np.array([ 1,  0,  0, -1])]}


start_time = time.time()
with open('testpickle', 'wb') as myfile:
    pickle.dump(b, myfile)
print("--- Time to save with pickle: %s milliseconds ---" % (1000*time.time() - 1000*start_time))

start_time = time.time()
np.save('numpy', b)
print("--- Time to save with numpy: %s milliseconds ---" % (1000*time.time() - 1000*start_time))

start_time = time.time()
with open('testpickle', 'rb') as myfile:
    g1 = pickle.load(myfile)
print("--- Time to load with pickle: %s milliseconds ---" % (1000*time.time() - 1000*start_time))

start_time = time.time()
g2 = np.load('numpy.npy')
print("--- Time to load with numpy: %s milliseconds ---" % (1000*time.time() - 1000*start_time))

输出:

--- Time to save with pickle: 4.0 milliseconds ---
--- Time to save with numpy: 1.0 milliseconds ---
--- Time to load with pickle: 2.0 milliseconds ---
--- Time to load with numpy: 1.0 milliseconds ---

我的实际大小(字典中约有100,000个键)时差更加明显。

为什么在保存和加载时,泡菜比np.save花费的时间更长?

pickle什么时候应该使用?


问题答案:

因为只要书面对象不包含Python数据

  • numpy对象在内存中的表示方式比Python对象简单得多
  • numpy.save用C编写
  • numpy.save以超简单的格式写,需要最少的处理

与此同时

  • Python对象有很多开销
  • pickle用Python编写
  • pickle将数据从内存中的基本表示形式转换为要写入磁盘的字节

注意,如果一个numpy数组确实包含Python对象,那么numpy只会腌制该数组,所有的胜利都将出局。



 类似资料:
  • 问题内容: 我一直在使用pickle感到非常高兴,然后我看到了这篇文章:不要为您的数据腌制 进一步阅读似乎是: 泡菜慢 泡菜不安全 泡菜不是人类可读的 泡菜不是与语言无关的 我已将数据保存为JSON,但我想了解最佳做法: 考虑到所有这些问题,您何时会使用泡菜?需要使用哪种特定情况? 问题答案: Pickle是不安全的,因为它通过调用任意函数来构造任意Python对象。但是,这也使它可以序列化几乎所

  • 我们启动一个Kafka消费者,监听一个可能还没有创建的主题(不过,主题自动创建是启用的)。 此后不久,一位制作人发表了关于这个话题的消息。 Kafka原木

  • 开始在Android Studio v1.2.1中构建一个基本的Hello World应用程序 Gradle Build花费了太多的时间来构建和运行应用程序。 有人能说出原因,3Q

  • 我正在尝试执行以下操作:假设我有以下SELECT查询(请原谅德文列名): 这个查询大约需要4秒(数据库总共有大约100万条记录),返回大约400条记录。但是,当我想用以下语句更新这些相同的记录时 查询总是在取“永远”后超时。是我做错了什么,还是这种行为是意料之中的?

  • 我的Gradle构建需要1分钟到2分钟,我不确定发生了什么。在事件日志中,我大部分时间都只看到一个条目 执行任务:[:app:GenerateDebugSources,:app:PrepareDebugunitTestDependencies,:app:MockableAndroidJar,:app:AssembleDebug] 我不知道这个任务在做什么,我检查了设置,希望这能有所改变,但我运气不

  • 连接到当地的redis,Lestuce需要近5000ms,但Jedis只需要30ms。我指的是以下示例ConnectToRedis 2020-08-14 17:02:28.236信息21760--[main]com.example.demo.jedisrunner:jedis:27 ms 2020-08-14 17:02:33.318信息21760--[main]com.example.demo.