python java 速度
来源:互联网 发布:淘宝怎么代销产品 编辑:程序博客网 时间:2024/05/24 01:53
使用者两种语言的比较理由
由于工作关系需要压力测试往数据库中加入10000000(1000w)条的数据,使用Python 优化后的代码在插入10000(1w)条 数据要30分钟 ,后来实在没有办法想用java来提高效率。最后的结果让我太惊讶。java只需要6分钟(没有优化的) 优化后只需要不到30秒
注意地方
1 做大量插入的时候要使用批量插入,如果循环一次插入一次效率是非常地下的
2 有共享数据的时候,使用多线程真是不好处理,Java中使用锁 同步锁后效率会和 单线程的熟读差不多,只有一个执行完了才轮到其他的线程。
下面是java 和python的主要代码
package ohho;import java.sql.SQLException;import java.util.ArrayList;import java.util.List;import java.util.UUID;import ohho.dao.ExtensionDao;import ohho.dao.TokenDao;import ohho.dao.UserDao;import ohho.servlet.AddUser;import ohho.servlet.AddToken;import ohho.servlet.AddExtension;import ohho.dao.UserDao;public class ATestnew { public static void main(String[] args) throws SQLException { UserDao user_dao = new UserDao(); TokenDao token_dao = new TokenDao(); ExtensionDao extension_dao = new ExtensionDao(); long t1=System.currentTimeMillis(); long number= 500000; List<Integer> list = new ArrayList<Integer>(); list = user_dao.insert_user_new(number); System.out.println("list" + list.size()); token_dao.insert_token_new(list); extension_dao.add_Extension_new(list); long t2=System.currentTimeMillis(); long t3 = t2 - t1; double t4 = t3 / 1000 /60; System.out.println("直接执行时间(毫秒)" + t3);// System.out.println("花费时间(分钟):"+ t4); }}
jdbc 连接数据库
package ohho.tools;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;public class JdbcUntil {//// public static final String url = "jdbc:mysql://localhost:3306/ohho?useUnicode=true&characterEncoding=utf-8&rewriteBatchedStatements=true"; // public static final String name = "com.mysql.jdbc.Driver"; // public static final String user = "root"; // public static final String password = "111111"; public static Connection conn = null; public static Connection getConnection(){ try { Class.forName(name);//指定连接类型 conn = DriverManager.getConnection(url, user, password);//获取连接// System.out.println("连接了"); return conn; } catch (Exception e) { throw new RuntimeException("链接错误"); // e.printStackTrace(); } } public static void close() { try { conn.close(); // System.out.println("关闭了吗"); } catch (SQLException e) { e.printStackTrace(); } } public static void main(String[] args) { // TODO Auto-generated method stub Connection c=JdbcUntil.getConnection();//接受返回的对象,connection相当于一个接口 if(c!=null){ System.out.println("链接数据库成功"); } }}
userdao
package ohho.dao;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Timestamp;import java.util.ArrayList;import java.util.Date;import java.util.List;import ohho.tools.JdbcUntil;import java.util.UUID;import com.mysql.jdbc.Statement;public class UserDao { public int insert_user(String username,String password,String cellphone, int country_code_id){ // 这个方法是循环一次提交一次的典型代表 Connection conn=JdbcUntil.getConnection(); String sql="insert into ohho_user (username,password,cellphone,country_code_id,created_at,changed_at,timestamp,state) values(?,?,?,?,?,?,?,?)"; ResultSet rs = null; int id = 0; try { PreparedStatement ps = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS); ps.setString(1, username); ps.setString(2, password); ps.setString(3, cellphone); ps.setInt(4, country_code_id); ps.setTimestamp(5,new Timestamp(new Date().getTime())); ps.setTimestamp(6,new Timestamp(new Date().getTime())); ps.setLong(7, new Date().getTime()); ps.setInt(8, 1); ps.executeUpdate(); rs = ps.getGeneratedKeys(); if (rs.next()) { id = rs.getInt(1); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } JdbcUntil.close();// System.out.println(id); return id; }public List<Integer> insert_user_new(long number) throws SQLException{ UserDao user_dao = new UserDao(); List<Integer> user_id_list = new ArrayList<Integer>(); String password = "1411678a0b9e25ee2f7c8b2f7ac92b6a74b3f9c5"; int country_code_id = 159; String cellphone = "12345678912"; long cellphone_long = 1234567891 ; cellphone = user_dao.get_cellphone(); if (cellphone != null){ cellphone_long = Long.parseLong(cellphone); } Connection conn=JdbcUntil.getConnection(); String sql="insert into ohho_user (username,password,cellphone,country_code_id,created_at,changed_at,timestamp,state) values(?,?,?,?,?,?,?,?)"; int id = 1; conn.setAutoCommit(false); try { PreparedStatement ps = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS); for (int i = 0; i < number; i++) { String uuid = UUID.randomUUID().toString().replaceAll("-", ""); String username = uuid; cellphone_long = cellphone_long + 1; ps.setString(1, username); ps.setString(2, password); ps.setString(3, String.valueOf(cellphone_long)); ps.setInt(4, country_code_id); ps.setTimestamp(5,new Timestamp(new Date().getTime())); ps.setTimestamp(6,new Timestamp(new Date().getTime())); ps.setLong(7, new Date().getTime()); ps.setInt(8, 1); ps.addBatch();// if (i % 1000 == 0){// ps.executeBatch();// } } ps.executeBatch(); conn.commit(); ResultSet rs = ps.getGeneratedKeys() ; while (rs.next()) { id = rs.getInt(1); user_id_list.add(id); } ps.close(); } catch (SQLException e) { e.printStackTrace(); } JdbcUntil.close(); return user_id_list; } public String get_cellphone(){ Connection conn=JdbcUntil.getConnection(); String sql="SELECT cellphone FROM ohho_user where id in (SELECT MAX(id) from ohho_user)"; String cellphone = null; try { PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery(); if(rs.next()){ cellphone = rs.getString("cellphone"); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } JdbcUntil.close();// System.out.println(cellphone); return cellphone; } public static void main(String[] args) throws Exception { UserDao user = new UserDao(); String a = user.get_cellphone(); System.out.println(a); }}
tokendao
package ohho.dao;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Timestamp;import java.util.ArrayList;import java.util.Date;import java.util.List;import java.util.UUID;import ohho.tools.JdbcUntil;import com.mysql.jdbc.Statement;public class TokenDao {public void insert_token(int user_id,String token){ Connection conn=JdbcUntil.getConnection(); String sql="insert into ohho_user_token (user_id,token,created_at,changed_at,timestamp) values(?,?,?,?,?)"; try { PreparedStatement ps = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS); ps.setInt(1, user_id); ps.setString(2, token); ps.setTimestamp(3,new Timestamp(new Date().getTime())); ps.setTimestamp(4,new Timestamp(new Date().getTime())); ps.setLong(5, new Date().getTime()); ps.executeUpdate(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } JdbcUntil.close(); }public void insert_token_new(List<Integer> list_user_id) throws SQLException{ Connection conn=JdbcUntil.getConnection(); String sql="insert into ohho_user_token (user_id,token,created_at,changed_at,timestamp) values(?,?,?,?,?)"; conn.setAutoCommit(false); try { PreparedStatement ps = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);// System.out.println("进来大小"+list_user_id.size()); for (int i = 0; i < list_user_id.size(); i++) { String token = UUID.randomUUID().toString().replaceAll("-", ""); ps.setInt(1, list_user_id.get(i)); ps.setString(2, token); ps.setTimestamp(3,new Timestamp(new Date().getTime())); ps.setTimestamp(4,new Timestamp(new Date().getTime())); ps.setLong(5, new Date().getTime()); ps.addBatch();// if (i % 1000 == 0){// ps.executeBatch();// }// System.out.println("进来了多少次"); } ps.executeBatch(); conn.commit(); ps.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } JdbcUntil.close();}}
使用批量插入比每次插入的效率有60倍的差异
python
python 实现效率比较高的也是用批量插入。tornado 我使用的是orm sqlalchemy 框架
最基本的核心代码
def add_user_commit_all(self, number=10): cellphone = 10000000000 # identity_card = 100000000000000000 user_query = self.user.get_query() user_query = self.user.order_by_id_desc(user_query) user_obj = Operation.first(user_query) if user_obj: if user_obj.cellphone: cellphone = int(user_obj.cellphone) i = 1 dic_list_token = list() dic_list_extension = list() while i <= number: # OHHOLog.print_log(i) print(i) i += 1 cellphone += 1 data = dict() while self.user.get_by_cellphone(str(cellphone)): cellphone = cellphone + 1 user_id = self.add_user_table(str(cellphone)) token_dic = self.add_user_token_table_dic(user_id) extension_dic = self.add_user_extension_dic(user_id) dic_list_token.append(token_dic) dic_list_extension.append(extension_dic) self.token.token.bulk_add(dic_list_token) self.user_extension.bulk_add(dic_list_extension) print("for end") print("end")
def bulk_add(self, dict_list): return Operation.bulk_add(self.model, dict_list)
批量实现插入
@staticmethod def bulk_add(model, dict_list): try: session.execute(model.__table__.insert(), dict_list) session.commit() return True except Exception as ex: OHHOLog.print_log(ex) return False
阅读全文
0 0
- python java 速度
- python的dict速度
- python简单速度测试
- python 速度优化
- Python发现速度
- python 3, 字符串连接速度
- 杀毒软件影响python运行速度
- python字符串拼接速度对比
- C++/C#/F#/Java/JS/Lua/Python/Ruby渲染速度比试
- C++/C#/F#/Java/JS/Lua/Python/Ruby渲染速度比试
- JAVA的速度
- java速度入门一
- java速度入门二
- java速度入门三
- java速度入门一
- java速度入门二
- java速度入门三
- Java执行速度大幅提高
- 2017/12/22
- android系统平台显示驱动开发简要:LCD驱动调试篇『四』
- 控制反转(IOC)、依赖注入(DI)之通过set方法注入
- 软件需求规格
- gettype
- python java 速度
- 干货转载,log4j2配置讲解,深入浅出,好文收藏
- iTunes 打包,iTunes 升级12.7 没有应用的问题,加入iTunes 12.6老版本
- SQL语句优化浅谈
- 安卓开发请求服务器的两种方式GET与POST(另附验证码的倒计时)
- 3.5永久安装代码
- nginx与tomcat负载均衡
- 深入学习jQuery元素尺寸和位置操作
- 浏览器内部工作原理