小编tur*_*nip的帖子

COPY如何工作?为什么它比INSERT快得多?

今天,我花了一天时间来改进我的Python脚本的性能,该脚本将数据推送到我的Postgres数据库中.我以前是这样插入记录的:

query = "INSERT INTO my_table (a,b,c ... ) VALUES (%s, %s, %s ...)";
for d in data:
    cursor.execute(query, d)
Run Code Online (Sandbox Code Playgroud)

然后我重新编写了我的脚本,以便创建一个内存文件,而不是用于Postgres的COPY命令,它允许我将数据从文件复制到我的表:

f = StringIO(my_tsv_string)
cursor.copy_expert("COPY my_table FROM STDIN WITH CSV DELIMITER AS E'\t' ENCODING 'utf-8' QUOTE E'\b' NULL ''", f)
Run Code Online (Sandbox Code Playgroud)

这种COPY方法速度惊人.

METHOD      | TIME (secs)   | # RECORDS
=======================================
COPY_FROM   | 92.998    | 48339
INSERT      | 1011.931  | 48377
Run Code Online (Sandbox Code Playgroud)

但我找不到任何关于为什么的信息?它与多线程的工作方式有何不同INSERT,使其更快?

也看到这个基准:

# original
0.008857011795043945: query_builder_insert
0.0029380321502685547: copy_from_insert

#  10 records …
Run Code Online (Sandbox Code Playgroud)

python postgresql sql-insert postgresql-copy

19
推荐指数
2
解决办法
5423
查看次数

我应该使用pip.main()或subprocess.call()来调用pip命令吗?

我正在编写一个需要使用pip安装依赖项的程序.这样做的正确方法是什么?为什么?

理想情况下,它需要与平台无关,但该程序将在Linux机器上运行.

方法1: pip.main()

import pip
args = ['param1', 'param2']
version = 0.1
package = ['some_package=={}'.format(version)]
pip.main(['install'] + args + package) 
Run Code Online (Sandbox Code Playgroud)

方法2: subprocess.call()

import subprocess
import sys
version = 0.1
package = 'some_package'

subprocess.call([sys.executable, '-m', 'pip', 'install', '{}=={}'.format(package, version)])
Run Code Online (Sandbox Code Playgroud)

python subprocess pip

9
推荐指数
1
解决办法
1580
查看次数

如何在PyCharm中更改IPython控制台的启动首选项?

我正在尝试做这个问题的用户正在做的事情。我有它为单独的IPython控制台工作,但没有集成到PyCharm中的控制台。

综上所述,我希望IPython在启动时导入一些模块。我已经进入C:\Users\Name\.ipython\profile_default\startup目录,并制作了一个startup.py文件,其中包含

from numpy import *
print 'NumPy imported succesfully!'
Run Code Online (Sandbox Code Playgroud)

设置PYTHONSTARTUP指向文件后,PyCharm外部的IPython控制台将按预期工作,但PyCharm中的IPython控制台无法正常工作。

python ipython

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

这是在Postgres中批量在冲突中插入INSERT的正确方法吗?

我将提供我的问题的简化示例。

我有两个表:reviewsusers

reviews更新了一系列用户发布的评论。获取评论的过程还返回提交评论的用户的信息(某些用户数据经常更改)。

我想在users每次reviews使用批量更新时进行更新COPYusers当获取的数据包含来自同一用户的两个或多个评论时,就会出现此问题。如果我做的很简单INSERT ON CONFLICT,我可能会遇到错误,因为and INSERT语句无法两次更新同一行。

A SELECT DISTINCT可以解决该问题,但是我也想保证将最新数据插入users表中。这就是我的做法。请记住,我正在批量执行此操作:

1.创建一个临时表,以便我们可以COPY往返它。

CREATE TEMPORARY TABLE users_temp (
    id uuid, 
    stat_1 integer, 
    stat_2 integer, 
    account_age_in_mins integer);
Run Code Online (Sandbox Code Playgroud)

2. COPY数据放入临时表

COPY users_temp (
    id,
    stat_1,
    stat_2,
    account_age_in_mins) FROM STDIN CSV ENCODING 'utf-8';
Run Code Online (Sandbox Code Playgroud)

3.锁定users表并执行INSERT ON CONFLICT

LOCK TABLE users in EXCLUSIVE MODE;

INSERT INTO users SELECT DISTINCT ON (1) 
    users_temp.id, …
Run Code Online (Sandbox Code Playgroud)

postgresql bulkinsert upsert

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

在Python中编写无限和(具有整数的函数)

我需要证明:

从i = 1到c的绝对值的平方的无穷大的总和等于1

令人讨厌的是c_i等于函数G的积分.这是我的尝试.

import numpy as np
from scipy.integrate import quad

def G(x,n):
    P = (np.sqrt(735))*(np.sqrt(2))*np.sin(n*np.pi*x)*((x**3.0) - (11.0/7.0)*(x**2.0) + (4.0/7.0)*(x))
    return P

def Sum(x, n):
    i = 1
    S = 0
    I, err = quad(G, 0, 1, args=(i))
    while (i<n):
        S = S + I
        i = i + 1
    return S
x = np.linspace(0, 1, 250)    
print Sum(x, 200)
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是编写求和部分.当我运行这个时,我得到一个更大的数字,我给它的值越多.如果选择n非常高(而不是无穷大),则可以显示总和如何趋于1

python numpy sum infinite

4
推荐指数
2
解决办法
3018
查看次数

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

PostgreSQL 的 to_tsvector 函数可以返回标记/单词而不是词素吗?

PostgreSQL 的to_tsvector功能非常有用,但就我的数据集而言,它的作用比我想要的要多一些。

例如:

select * 
from to_tsvector('english', 'This is my favourite game. I enjoy everything about it.');
Run Code Online (Sandbox Code Playgroud)

产生:'enjoy':7 'everyth':8 'favourit':4 'game':5

我并不担心停用词被过滤掉,这很好。但有些词会被完全毁掉,比如everythingand favourite

有没有办法修改这种行为,或者是否有不同的函数可以做到这一点?

PS:是的,我可以编写自己的查询来执行此操作(并且我已经这样做了),但我想要一种更快的方法。

postgresql nlp lemmatization

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

使用d3从一侧到另一侧的水平淡入过渡?

我知道如何使用opacity属性在转换中进行正常淡入淡出,但是我将如何从元素的一端开始转换并逐渐水平完成?

像这样的东西:

在此输入图像描述

我试图为一些文本这样做:

text = svg.selectAll(".myText")
          .data(myData)
          .enter()
          .append("text")
          .attr("class", "myText")
          .attr("text-anchor", "start")
          .attr("fill-opacity", 0)
          .text(function (d)
          {
              return d.message
          });

text.transition()
    .delay(500)
    .duration(1000)
    .attr("fill-opacity", 1)
Run Code Online (Sandbox Code Playgroud)

javascript d3.js

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

如何使用NumPy创建自定义4x4阵列?

我是Python的新手,我在使用数组函数时遇到了一些麻烦.我想制作一个4乘4的数组,其中包含1到16之间的数字.

我知道使用 np.zeros((4,4))输出4x4数组全部为零.使用np.array(range(17))我可以获得所需数字的数组但不是正确的形状(4x4).

它肯定相当简单吗?所有评论都非常感谢.

python arrays numpy

2
推荐指数
1
解决办法
6698
查看次数

Orleans 应用程序如何从容器中受益?

Microsoft Orleans 框架提供了一种无需太多复杂性即可构建分布式、大规模系统的方法。

缩放对于奥尔良来说是很​​自然的;如果主机出现故障,则该主机上的活动谷物会在其他地方重新激活,因为它们的状态会保留在存储中。

考虑到这一点,Docker 等容器服务如何应用于生产中的 Orleans 应用程序?如果 Orleans 默认情况下已经可以扩展,为什么我们需要一个精心设计的容器服务来进行扩展?

c# docker orleans docker-swarm

2
推荐指数
1
解决办法
661
查看次数