范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Python快速大批量写数据到PostgreSQL数据表

  Python和PostgreSQL数据库协同工作,需要用到psycopg2工具库,这也是Python编程中最常用的接口。 但是,为了适应不同的写入速度,psycopg2工具库提供了多种执行写入的方法,常用的有以下四种: execute() executemany() execute_batch() 构建个性化的字符串
  下面对这四种方法的执行写数据到PostgreSQL数据表的速度做一个比较,看看插入10000条、100000条、1000000条记录,以上各种方法各自耗时多少。
  创建数据表,定义计时函数 CREATE TABLE IF NOT EXISTS public.test_table (    source TEXT,    datetime TIMESTAMP,      mean_temp NUMERIC    );
  自定义的计时函数:def measure_time(func):     def time_it(*args, **kwargs):         time_started = time.time()         func(*args, **kwargs)         time_elapsed = time.time()         print("{execute} 耗时 {sec} 秒,插入 {rows} 行记录".format(execute=func.__name__,                                                                                           sec=round(                                                                                               time_elapsed - time_started,                                                                                               4), rows=len(                 kwargs.get("values"))))      return time_it
  方法1:execute()
  此方法是执行数据库操作的标准函数,为了插入大批量的数据行,就必须要针对数据使用循环,并且调用该方法,一行一行地把数据插入到数据库的表中。执行execute()的方法代码如下:def method_execute(self, values):              for value in values:             self.cursor.execute("INSERT INTO {table} VALUES (%s, %s)".format(table=TABLE_NAME), value)         self.connection.commit()
  众所周知,执行循环是很慢的,插入1万条、10万条、100万条数据的执行结果如下:
  可以看出,数据越多,花费的时间越长,两者基本上是线性关系。
  方法2:executemany()
  Psycopg2提供的 executemany()方法,并不是对execute()方法的简单改进,执行executemany()的方法代码如下:@measure_time  def method_execute_many(self, values):         self.cursor.executemany("INSERT INTO {table} VALUES (%s, %s)".format(table=TABLE_NAME), values)         self.connection.commit()
  下图是执行不同的数据量所耗费的时间,结果如下图:
  可以看出,方法1与方法2耗时并没有明显的差别。
  方法3:execute_batch()
  这是Psycopg2提供的又一种方法,它减少了访问数据库服务器的次数,与 executemany()相比,性能有了很大的改进。这种方法把许多语句拼接在一起,只受到page_size的限制(PostgreSQL中一般是8kB),执行execute_batch()的方法代码如下:@measure_time     def method_execute_batch(self, values):         psycopg2.extras.execute_batch(self.cursor, "INSERT INTO {table} VALUES (%s, %s)".format(table=TABLE_NAME),                                       values)         self.connection.commit()
  插入不同长度的数据,耗时结果如下图:
  可以看出,这种方法的执行速度,比execute()方法和executemany()方法提高了将近4倍!
  方法4:构建个性化的字符串
  这种方法是构建一个个性化的字符串,然后用一条execute()语句来执行,代码如下: @measure_time     def method_string_building(self, values):         argument_string = ",".join("("%s", "%s")" % (x, y) for (x, y) in values)         self.cursor.execute("INSERT INTO {table} VALUES".format(table=TABLE_NAME) + argument_string)         self.connection.commit()
  看看这种方法的运行时间,结果如下图:
  从图中的结果可以看出,这种方法是最快的,比方法1、方法2提高了20多倍,比方法3提高了3倍!
  本文完整代码如下:import time import psycopg2 import psycopg2.extras  TABLE_NAME = "TestTable"   def measure_time(func):     def time_it(*args, **kwargs):         time_started = time.time()         func(*args, **kwargs)         time_elapsed = time.time()         print("{execute} 耗时 {sec} 秒,插入 {rows} 行记录".format(execute=func.__name__,                                                                          sec=round(time_elapsed - time_started,4),                                                                          rows=len(kwargs.get("values"))))      return time_it   class PsycopgTest():      def __init__(self, num_rows):         self.num_rows = num_rows      def create_dummy_data(self):         values = []         for i in range(self.num_rows):             values.append((i + 1, "test"))         return values      def connect(self):         conn_string = "host={0} user={1} dbname={2} password={3}".format("localhost",                                                                          "postgres",                                                                          "tutorial", "caspar")         self.connection = psycopg2.connect(conn_string)         self.cursor = self.connection.cursor()      def create_table(self):         self.cursor.execute(             "CREATE TABLE IF NOT EXISTS {table} (id INT PRIMARY KEY, NAME text)".format(table=TABLE_NAME))         self.connection.commit()      def truncate_table(self):         self.cursor.execute("TRUNCATE TABLE {table} RESTART IDENTITY".format(table=TABLE_NAME))         self.connection.commit()              @measure_time     def method_execute(self, values):         """Loop over the dataset and insert every row separately"""         for value in values:             self.cursor.execute("INSERT INTO {table} VALUES (%s, %s)".format(table=TABLE_NAME), value)         self.connection.commit()      @measure_time     def method_execute_many(self, values):         self.cursor.executemany("INSERT INTO {table} VALUES (%s, %s)".format(table=TABLE_NAME), values)         self.connection.commit()      @measure_time     def method_execute_batch(self, values):         psycopg2.extras.execute_batch(self.cursor, "INSERT INTO {table} VALUES (%s, %s)".format(table=TABLE_NAME),                                       values)         self.connection.commit()      @measure_time     def method_string_building(self, values):         argument_string = ",".join("("%s", "%s")" % (x, y) for (x, y) in values)         self.cursor.execute("INSERT INTO {table} VALUES".format(table=TABLE_NAME) + argument_string)         self.connection.commit()   def main():     psyco = PsycopgTest(10000)     psyco.connect()     values = psyco.create_dummy_data()     psyco.create_table()     psyco.truncate_table()     psyco.method_execute(values=values)     # psyco.method_execute_many(values=values)     # psyco.method_execute_batch(values=values)     # psyco.method_string_building(values=values)   if __name__ == "__main__":     main()

最神秘的香港村落锁罗盆,村民一夜消失?曾流传着恐怖的灵异故事锁罗盆有香港最神秘村落之称,路途遥远且很不就脚,所以尽管风景优美,到过的人不算多。这个圣诞假期,笔者与一众好友乘搭锁罗盆村长黄庆祥的锁罗盆村私家飞艇,潇洒走一回。登陆上世纪60年代河北正定园博园大型实景演出打铁花邀您一起欢喜过大年!古城记忆遇见正定大型沉浸式实景演出5A专业团队历时百天斥巨资倾力打造超震撼的沉浸式演绎,超狂欢的体验!体验不一样的新春之旅!2023河北正定园博园千年古城记忆喜迎盛世新春营业时间8春节去哪儿玩?开年游梧州!美景美食等你来敲响新年新篇章红红火火过春节!1月18日上午,2023年梧州市文化和旅游消费季开年游梧州活动,在明朝两广总督府文化旅游博览区启动。市委常委宣传部部长黄恩宣布活动正式启动。副市长苏颖伊利联合拼多多发春节福利,推出谷粒多兔年定制款,首日就卖爆了在上线的第一天,谷粒多兔年定制款产品的销量就突破了10万盒,这让伊利电商运营团队颇为惊喜。2022年12月底,伊利在拼多多平台首发了谷粒多春节定制新品,不到三天时间,新品就一售而罄新年第一游,你准备去哪里?随着新年长假的来临不少人都开启了搁置已久的旅行计划有人去了南方的海岛过冬有人去北方的平原看雪这个长假你想去哪里看看呢?如果可以我想逛一次集市尝一尝新鲜出炉的各色小吃摊位上摆满了琳琅郭晶晶晒新年贺岁照!留长卷发温柔不少,手上钻戒抢镜新年的钟声即将敲响,郭晶晶也随夫晒出一组贺岁视频,久违露面的晶晶,似乎又靓丽了不少。一直不好打扮的她,即使在这种场合,也是衣着简约,低调端庄。身穿一款黑色中式薄纱外套,内搭红色长裙七彩风车迎新春新年出行第一站鲤鱼滩!来源绿色中国梦幻鲤鱼滩七彩风车节浙江常山天马鲤鱼滩风车节新春炫彩开幕虎辞盛岁,兔跃新程去哪里拥抱新年第一缕阳光去哪里见证新年第一抹缤纷去哪里收获新年第一份好运鲤鱼滩新年限定七彩风车新年开新局,国际健康食品港超大明星项目建设势头强劲!临近春节,由海南京粮控股股份有限公司国投交通控股有限公司中储粮(海南)有限公司三家实力强劲的央国企共同投资的洋浦现代进口食品加工产业园项目建设稳步推进。工人们抢工期赶进度,保持项目出境团队游恢复,收到意料之外新年礼物的旅行社江湖,我们要回来了!钱江晚报小时新闻记者周丰杨希林出境游的宝子们,请查收新年礼物江湖,我们要肥来了三年终于熬出头,前尘往事无须追忆,努力当下今天傍晚,记者朋友圈里的欢呼声已是一浪高过一浪。就在今天17金茂大厦邀市民新年登高云中漫步送出最暖新春祝福东方网记者曹磊11月19日报道新年步步高节节向上攀,用登高的方式为新的一年祈福。新春即将来临之际,金茂大厦88层观光厅特别推出,展宏兔主题展空中爱情主题邮局送祝福等活动,邀请市民游抽红包戏雪滑雪刨汤宴祈福来巴山大峡谷过个巴适年春节到新年到春节至,团圆近巴山大峡谷景区与您一起开开心心过春节欢欢喜喜迎新年幸幸福福一整年邀您来巴山大峡谷过个巴适年让你在巴山大峡谷过一个难忘的新年过个安逸巴适年新年伊始,瑞雪丰年
新赛季仅两支球队拥有三位上赛季全明星,勇士领衔骑士紧随其后骑士与爵士5换1交易后,前者得到全明星后卫米切尔,至此,骑士拥有三位上赛季进入全明星的球员,而在整个联盟中,新赛季能够拥有三位上赛季全明星球员的只有两支,骑士之外,只剩下勇士队。骑CBA交易汇总多笔转会签约诞生(5支球队),郭艾伦下家成谜北京时间2022年9月4日,让我们继续关注CBA联赛。CBA今夏交易市场正在如火如荼的进行,交易开启日至今已经发生了多笔球员交易及签约,接下来我们就来盘点一下今夏交易市场各球队的签29分溃败后再输21分!男篮欧洲杯最惨球队自家媒体都不愿转播了男篮欧洲杯进行至今究竟谁是最惨的球队?毫无疑问,英国队会以高票选当选。在小组赛首秀29分惨败给乌克兰后,他们在第2战又以21分的巨大分差输给克罗地亚,小组赛2战全败,晋级希望渺茫。破案了!终于有球队愿意收留威少,全明星大前锋接近加盟湖人随着杜兰特的留队和米切尔加盟爵士后,如今只剩下威少去留成谜了此前,据NBA名记萨姆阿米克称,今夏休赛期洛杉矶湖人队至少和五支球队讨论过关于维斯布鲁克的交易事宜,然而他们感兴趣的并非再见马布里!球队引援有限,联盟多支球队实力大增,难进季后赛距离CBA新赛季开赛还有不足2个月的时间,随着众多国手回到国内,各支球队的全主力阵容也马上就要出炉了。马布里这边上个赛季虽然没能带领北京北控杀入季后赛,但球队仍然网开一面,老马得以隐入尘烟剧情不切实际地乱拍,就是为了迎合洋大人的胃口吗?隐入尘烟这部电影最近很火,甚至入围了72届柏林电影节,一时间名声大噪,我以为是个不错的电影,以为是近些年来很好的一部国产片,然后就去搜着看了看,看完后感觉,也不外如是,但是不知道为服贸观止浙江综合展区四大专区聚焦数字服务贸易北京商报讯(记者董亮丁宁)在2022年服贸会上,浙江综合展区以数动浙江潮涌钱塘为主线,设置中心展区与四大产业展区。其中,四大专区由数字技术数字服务数字文化和数字平台组成,主要展现浙想要变得见多识广,可以看看这几个公众号荐号它们的每一篇文章都经过精心打磨它们不鸡汤不浮夸不陈腐只为你提供有价值有态度的美文和新知那些有深度会思考的见多识广的人都在关注诚意推荐这几个非常优质的公号!你一定不能错过哦!每日精品演员王刚最快乐的事情是陪儿子虚度时光著名表演艺术家王刚花甲之年得子,在人们的传统观念中,他对儿子肯定宠溺得不行,但事实恰恰相反,在家教方面他有着自己独特的见解。01hr用体育培养儿子的阳刚之气2008年8月25日,著贝克汉姆家婆媳战愈演愈烈,维多利亚修理豪门媳妇不手软贝克汉姆家婆媳大战愈演愈烈,英国每日邮报称维多利亚贝克汉姆与媳妇妮可拉佩尔兹为了婚纱交恶,维多利亚先是故意在婚礼上霸占妮可拉原先选好的夫妻第一支舞歌曲,变成新郎布鲁克林与母亲共舞的NBA数据不会说谎?落后三分以上刷两分,也会被统计为关键得分很多球迷持有一种观点,那就是看NBA实战比赛会有主观情绪,数据统计才准确,因为数字不会说谎。其实这种观点是不准确的,数据统计是服务比赛,而绝不能定义比赛,如果盲目相信数据,就会忽略