我当前的Python项目需要大量的字符串拆分来处理传入的包.由于我将在一个非常慢的系统上运行它,我想知道最有效的方法是什么.字符串的格式如下:
Item 1 | Item 2 | Item 3 <> Item 4 <> Item 5
Run Code Online (Sandbox Code Playgroud)
说明:此特定示例来自列表,其中前两个项目是标题和日期,而项目3到项目5将被邀请人员(其数量可以是从零到n的任何值,其中n是数字服务器上的注册用户).
从我看到的,我有以下选择:
split()解决方案1将包括拆分,|然后拆分结果列表的最后一个元素<>为此示例,而解决方案2可能会导致正则表达式,如:
((.+)|)+((.+)(<>)?)+
好的,这个RegEx太可怕了,我可以看到自己.它也是未经测试的.但是你明白了.
现在,我正在寻找a)花费最少时间和b)理想地使用最少量内存的方式.如果只有两个中的一个是可能的,我宁愿更少的时间.理想的解决方案也适用于具有更多项目|和完全没有的字符串的字符串<>.至少基于正则表达式的解决方案会这样做
我的理解是split()会使用更多的内存(因为你基本上得到两个结果列表,一个分裂,|第二个分裂<>),但我不太了解Pythons实现常规表达式来判断RegEx如何执行.split()如果它与某些不同数量的项目和第二个分隔符的缺失有关,那么它也不如正则表达式动态.尽管如此,我还是不能动摇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) 我想知道是否有一种简单的方法来存储有关该数据库中的sqlite-Database的元信息.
我正在考虑一个版本号,它可以让您轻松找出您正在使用的数据库布局版本(因此我的代码可以检查数据库结构是否兼容而无需查询SELECT sql FROM sqlite_master WHERE type='table';并将结果与预定义的原理图进行比较).澄清:我对sqlite软件的版本号不感兴趣,但类似于pythons __version__变量,可以为每个python文件单独定义.
我知道我可以创建一个名为"meta"的表并将其保存在那里,但我想知道是否有更好的方法可以做到这一点.
我也知道只检查版本号检查兼容性有一些问题,如果有必要我还会做其他检查,但是现在我只对我描述的版本号感兴趣.
今天早些时候,我要求提供一种简单的方法来存储您在 SQLite 中使用的 SQL 表布局的版本号,并得到了使用PRAGMA user_version. 由于Pragma在 MySQL 中没有 a 这样的东西,我想知道您将如何在 MySQL 中进行此操作(除了创建一个名为“META”且带有“DB-Scheme-Version”列的表)。
只是重复我在链接问题中所说的话:我不是在寻找一种方法来找出安装了哪个版本的 MySQL,而是要保存一个版本号,告诉我我正在使用什么版本的 MySQL-Scheme,而不是通过脚本检查每个表。
我也看到了这个问题,但它只允许我对单个表进行版本控制。对于整个数据库,是否有类似的或者更简单的东西(因为单独查询每个表并不有趣)?提前致谢。
MySQLSET GLOBAL可能会工作,但我更喜欢这样的解决方案,它不会在服务器每次重新启动时自行重置,并且不需要SUPER权限和/或访问配置文件的权限。简而言之:它应该与您租用小型虚拟主机包时获得的标准 MySQL 数据库配合使用,而不是租用完整服务器时获得的那些,因为您往往可以更多地访问这些。
我使用kdeplot来绘制两个二元分布的密度,如下所示,其中df_c和df_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的数据报服务器.
我遇到了以下问题:我使用多个分配线程将传入的包分配给不同的处理线程.在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) 我正在使用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线,以使其在黑白打印时能够区分?
python ×4
database ×2
matplotlib ×2
metadata ×2
seaborn ×2
mysql ×1
optimization ×1
split ×1
sqlite ×1
thread-local ×1