小编mal*_*ave的帖子

在Python中拆分字符串的最有效方法

我当前的Python项目需要大量的字符串拆分来处理传入的包.由于我将在一个非常慢的系统上运行它,我想知道最有效的方法是什么.字符串的格式如下:

Item 1 | Item 2 | Item 3 <> Item 4 <> Item 5
Run Code Online (Sandbox Code Playgroud)

说明:此特定示例来自列表,其中前两个项目是标题和日期,而项目3到项目5将被邀请人员(其数量可以是从零到n的任何值,其中n是数字服务器上的注册用户).

从我看到的,我有以下选择:

  1. 反复使用 split()
  2. 使用正则表达式和正则表达式函数
  3. 我还没有想到的其他一些Python函数(可能还有一些)

解决方案1将包括拆分,|然后拆分结果列表的最后一个元素<>为此示例,而解决方案2可能会导致正则表达式,如:

((.+)|)+((.+)(<>)?)+

好的,这个RegEx太可怕了,我可以看到自己.它也是未经测试的.但是你明白了.

现在,我正在寻找a)花费最少时间和b)理想地使用最少量内存的方式.如果只有两个中的一个是可能的,我宁愿更少的时间.理想的解决方案也适用于具有更多项目|和完全没有的字符串的字符串<>.至少基于正则表达式的解决方案会这样做

我的理解是split()会使用更多的内存(因为你基本上得到两个结果列表,一个分裂,|第二个分裂<>),但我不太了解Pythons实现常规表达式来判断RegEx如何执行.split()如果它与某些不同数量的项目和第二个分隔符的缺失有关,那么它也不如正则表达式动态.尽管如此,我还是不能动摇python在没有正则表达式的情况下可以做得更好的印象,这就是我要问的原因

一些说明:

  • 是的,我可以对这两个解决方案进行基准测试,但我正在尝试学习一般的python以及它如何在这里工作,如果我只是对这两个进行基准测试,我仍然不知道我错过了什么python函数.
  • 是的,在这个级别进行优化只是高性能的东西才真正需要,但正如我所说,我正在尝试学习有关python的东西.
  • 另外:在最初的问题中,我完全忘记提到我需要能够区分分离|的部分和分隔符的部分<>,因此re.split(\||<>,input)(由@obmarg提出)生成的简单平面列表不会工作得太好了.适合这个标准的解决方案非常受欢迎.

总结一下这个问题:出于什么原因,哪种解决方案最有效.

由于多个请求,我在split()@smarg 上运行了-solution和第一个提出的正则表达式的时间,以及@mgibsonbr和@duncan的解决方案:

import timeit
import re

def splitit(input):
    res0 = input.split("|")
    res = []
    for element in res0:
        t = element.split("<>")
        if t != …
Run Code Online (Sandbox Code Playgroud)

python optimization split

26
推荐指数
2
解决办法
3万
查看次数

存储有关SQLite数据库的元数据的简便方法

我想知道是否有一种简单的方法来存储有关该数据库中的sqlite-Database的元信息.

我正在考虑一个版本号,它可以让您轻松找出您正在使用的数据库布局版本(因此我的代码可以检查数据库结构是否兼容而无需查询SELECT sql FROM sqlite_master WHERE type='table';并将结果与​​预定义的原理图进行比较).澄清:我对sqlite软件的版本号感兴趣,但类似于pythons __version__变量,可以为每个python文件单独定义.

我知道我可以创建一个名为"meta"的表并将其保存在那里,但我想知道是否有更好的方法可以做到这一点.

我也知道只检查版本号检查兼容性有一些问题,如果有必要我还会做其他检查,但是现在我只对我描述的版本号感兴趣.

database sqlite metadata

7
推荐指数
1
解决办法
4041
查看次数

存储有关 MySQL 数据库的元数据的简单方法

今天早些时候,我要求提供一种简单的方法来存储您在 SQLite 中使用的 SQL 表布局的版本号,并得到了使用PRAGMA user_version. 由于Pragma在 MySQL 中没有 a 这样的东西,我想知道您将如何在 MySQL 中进行此操作(除了创建一个名为“META”且带有“DB-Scheme-Version”列的表)。

只是重复我在链接问题中所说的话:我不是在寻找一种方法来找出安装了哪个版本的 MySQL,而是要保存一个版本号,告诉我我正在使用什么版本的 MySQL-Scheme,而不是通过脚本检查每个表。

我也看到了这个问题,但它只允许我对单个表进行版本控制。对于整个数据库,是否有类似的或者更简单的东西(因为单独查询每个表并不有趣)?提前致谢。

MySQLSET GLOBAL可能会工作,但我更喜欢这样的解决方案,它不会在服务器每次重新启动时自行重置,并且不需要SUPER权限和/或访问配置文件的权限。简而言之:它应该与您租用小型虚拟主机包时获得的标准 MySQL 数据库配合使用,而不是租用完整服务器时获得的那些,因为您往往可以更多地访问这些。

mysql database metadata

5
推荐指数
1
解决办法
2680
查看次数

Seaborn:带有边缘直方图的 kdeplot

我使用kdeplot来绘制两个二元分布的密度,如下所示,其中df_cdf_n是两个 Pandas DataFrame:

f, ax = plt.subplots(figsize=(6, 6))
sns.kdeplot(df_c['attr1'], df_c['attr2'], ax=ax, cmap='Blues', shade_lowest=False)
sns.kdeplot(df_n['attr1'], df_n['attr2'], ax=ax, cmap='Reds',  shade_lowest=False)
Run Code Online (Sandbox Code Playgroud)

我还想包括边际直方图,例如由jointplot生成的边际直方图(示例图)。但是,我无法使用 jointplot (因为显然不可能用 jointplot 绘制两个不同的分布,因为每次调用它时它都会生成一个新的图形),并且我找不到有关如何重现它生成的边际直方图的任何信息。

有没有一种简单的方法可以使用 Seaborn / matplotlib 生成带有边缘直方图的 kdeplot?或者,我是否忽略了使用联合图绘制两个单独分布的方法?

python matplotlib seaborn

4
推荐指数
1
解决办法
1777
查看次数

Python:'thread._local对象没有属性'todo'

我目前正在使用线程和所有这些来编写基于python的数据报服务器.

我遇到了以下问题:我使用多个分配线程将传入的包分配给不同的处理线程.在Processing Threads中,我使用threading.local()来跟踪线程局部变量.

我目前正在测试我的服务器在高负载期间的反应(2000个数据包在~2秒内),并且发现了local() - Object的奇怪行为.

似乎它在一段时间内工作得很好,然后,在某些时候,它会引发异常:

Exception in thread 192.168.1.102: # <-- This is the Processing Thread
Traceback (most recent call last):
  File "/opt/lib/python2.7/threading.py", line 552, in __bootstrap_inner
    self.run()
  File "/volume1/home/Max/Python/MyThread/pyProcThread.py", line 37, in run
    print self.loc.father
AttributeError: 'thread._local' object has no attribute 'father'

# The following three lines are debug
# This is the Allocation thread that has called the Processing thread
<Thread(192.168.1.102, started 1106023568)> 
# This confirms that the queue it tries to access exists
<Queue.Queue instance …
Run Code Online (Sandbox Code Playgroud)

python multithreading thread-local python-multithreading

3
推荐指数
1
解决办法
4263
查看次数

Seaborn:在kdeplot中更改线条样式

我正在使用seaborn按照此答案中的描述创建具有边际分布的kdeplot 。我对代码进行了一些修改,以实现以下目的:

import matplotlib.pyplot as plt
import seaborn as sns

iris = sns.load_dataset("iris")
setosa = iris.loc[iris.species == "setosa"]
virginica = iris.loc[iris.species == "virginica"]

g = sns.JointGrid(x="sepal_width", y="petal_length", data=iris)
sns.kdeplot(setosa.sepal_width, setosa.sepal_length, cmap="Reds",
        shade=False, shade_lowest=False, ax=g.ax_joint)
sns.kdeplot(virginica.sepal_width, virginica.sepal_length, cmap="Blues",
        shade=False, shade_lowest=False, ax=g.ax_joint)
sns.distplot(setosa.sepal_width, kde=True, hist=False, color="r", ax=g.ax_marg_x)
sns.distplot(virginica.sepal_width, kde=True, hist=False, color="b", ax=g.ax_marg_x)
sns.distplot(setosa.sepal_length, kde=True, hist=False, color="r", ax=g.ax_marg_y, vertical=True)
sns.distplot(virginica.sepal_length, kde=True, hist=False, color="b", ax=g.ax_marg_y, vertical=True)
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

无法以黑白打印。我如何才能以特殊方式(点划线/点划线/ ...)打印kdeplot和distplot线,以使其在黑白打印时能够区分?

相关问题处理其他类型的显示支持这一地块,但这似乎并没有被支持kdeplotdistplot

python matplotlib seaborn

3
推荐指数
2
解决办法
3621
查看次数