- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
编辑:
事实证明,继承树中更高的基类继承了Tf.keras.Model
,当存在此类继承时,可以观察到下面描述的行为。与纯脚本相比,纯 Python 类的性能可以忽略不计。
我还没有找到任何与此行为相关的文档,如果有可用的更新将会随之而来。
编辑2:
我还没有找到任何关于此的文档(因此需要确认),但似乎:如果我将任何对象分配给 self(在 Tf.keras.Model 继承类中),则所有包含的 tf.Variables 都会被提取并出现在类的 trainable_variables
属性。所以我的假设是 keras.Model 检查对 self 的任何赋值,试图找到一些特定的对象,并且此检查会导致对 self 进行赋值巨大的字典要慢。
供引用:检查深入嵌套列表和字典,但不检查类,除非它们扩展了 ts.keras.Model
或 tf.keras.Layer
原始问题:
我有一个字符串列表 col
(约 300k 行约 30 个字符的字符串,给你一个想法)。准确地说,是 pandas.DataGrid
而不是列表。
我正在创建一个查找字典以供将来使用,如下所示:
direct = {}
inverse = {}
# progressive
progressive = 0
# create direct map
for label in col:
# skip if present
if str(label) in direct:
continue
# else add to direct
direct[str(label)] = progressive
inverse[progressive] = str(label)
progressive += 1
这里没什么奇怪的,它需要 0.15 秒,并且 python 进程内存使用情况是合理的。
然后我将代码移到了一个类中,事情变得很奇怪。这里提供了同一功能的两个略有不同的版本。
版本A:
def fromDataset(self, column):
# reset map
self.direct = {}
self.inverse = {}
# progressive
progressive = 0
# create direct map
for label in column:
# skip if present
if str(label) in self.direct:
continue
# else add to direct
self.direct[str(label)] = progressive
self.inverse[progressive] = str(label)
progressive += 1
版本B:
def fromDataset(self, column):
# reset map
direct = {}
inverse = {}
# progressive
progressive = 0
# create direct map
for label in column:
# skip if present
if str(label) in direct:
continue
# else add to direct
direct[str(label)] = progressive
inverse[progressive] = str(label)
progressive += 1
self.direct = direct
self.inverse = inverse
所有建议的函数都会产生相同的结果(约 120k 条目的字典,约 30MB RAM 占用)
我可以接受版本 A 可能会比版本 B 访问 self
变量慢一些,但我无法理解的是版本 B 怎么可能花费 2.16 秒(比以前快 14 倍)天气版本 A 甚至无法测试(10 多分钟后还没有结果,进程内存使用量增加了 500+ MB)
更奇怪的是版本 B 需要 0.17 秒来创建字典,大约 2 秒来执行:
self.direct = direct
self.inverse = inverse
在为此迷失了一整天之后,我开始想知道是否有一些与我遗漏的与 Python 内存分配相关的东西。我得出的唯一有意义的假设是 self.direct = direct 导致 Python 实际上移动/复制 ram 中的字典。
任何人都可以向我解释一下版本 A 和版本 B 中发生的情况与直接脚本版本有何根本不同吗?
最佳答案
我创建了一个可重现的示例,没有遇到任何问题:
import random
import string
import pandas
def gen_random_word(word_length=30):
return ''.join((random.choice(string.ascii_letters) for _ in range(word_length)))
# I create a list of 300000 labels (but only 150k distinct labels) of 30 characters
labels = [gen_random_word() for _ in range(150000)]
labels = labels + labels
random.shuffle(labels)
# A dataframe here is useless but I try to get close to your own example
df = pandas.DataFrame(
{'labels': labels}
)
class A:
def __init__(self):
self.direct = {}
self.inverse = {}
self.progressive = 0
def fromDataset(self, column):
# create direct map
for label in column:
# skip if present
if str(label) in self.direct:
continue
# else add to direct
self.direct[str(label)] = self.progressive
self.inverse[self.progressive] = str(label)
self.progressive += 1
class B:
def __init__(self):
self.direct = {}
self.inverse = {}
self.progressive = 0
def fromDataset(self, column):
# reset map
direct = {}
inverse = {}
# progressive
progressive = 0
# create direct map
for label in column:
# skip if present
if str(label) in direct:
continue
# else add to direct
direct[str(label)] = progressive
inverse[progressive] = str(label)
progressive += 1
self.direct = direct
self.inverse = inverse
self.progressive = progressive
第一次测试:
%%time # remove that if you are not using jupyter and use another timing solution
direct = {}
inverse = {}
# progressive
progressive = 0
# create direct map
for label in df['labels']:
# skip if present
if str(label) in direct:
continue
# else add to direct
direct[str(label)] = progressive
inverse[progressive] = str(label)
progressive += 1
挂起时间:267 毫秒
第二次测试:
%%time
a = A()
a.fromDataset(df['labels'])
挂起时间:249 毫秒
第三次测试:
%%time
b = B()
b.fromDataset(df['labels'])
挂起时间:220 毫秒
所以...没什么重要的。
关于python - tf.keras.Model类~自变量性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60006722/
我有一个名为copyToClipboard()的函数。这需要一个名为 element 的参数。该函数通过定位元素的 id、选择并复制内容来复制元素的内容。 例如: JS /* * Copy to c
我正在研究 Java,想知道以下各项在性能方面有何不同。我知道过早优化是编程的困境,但我的好奇心仅供将来引用。 public class Type1{ int[] data = new da
我正在使用此代码从 csv 文件中获取数组: array_map('str_getcsv', 'file.csv') 但是在 array_map 函数中使用它时,如何为 str_getcsv() 设置
我是一名优秀的程序员,十分优秀!