Python的按位移位真的很慢吗?

问题描述 投票:3回答:1

我必须忽略一些东西,但是真的不明白为什么Python代码这么慢...

计算元素在[-1,000,000..1,000,000]范围内的数组中的唯一元素,并使用位向量执行此操作。使用BitSet的Java代码比使用Python的9秒(大约)快50倍。

这可能是因为当我初始化bitvector = 0时,Python没有保留足够的内存,并且随着位向量的增长需要复制位向量吗?

Python:

def solution(array):
    bitvector = 0
    count = 0
    for element in array:
        # transform -1,000,000 to 0 etc
        element_transformed = element + 1000000
        if bitvector >> element_transformed & 1 == 0:
            count += 1
            bitvector = bitvector | 1 << element_transformed

    return count

测试:

import unittest
import random

from .file1 import solution

class MySolutionTests(unittest.TestCase):
    def test_solution_random_all_unique(self):
        a = random.sample(range(-1000000, 1000001), 100000)
        self.assertEqual(100000, solution(a))

在Java中:

package mypackage;

import java.util.ArrayList;
import java.util.BitSet;
import java.util.List;


public class MyClass {

    public static int solution(List<Integer> array) {
        BitSet bitvector = new BitSet();
        int count = 0;

        for(int i = 0; i < array.size(); i++) {
            int elementTransformed = array.get(i) + 1000000;
            if(bitvector.get(elementTransformed) != true) {
                count++;
                bitvector.set(elementTransformed, true);
            }
        }
        return count;
    }

    public static void main(String[] args) {
        // TODO code application logic here
    }
}

测试:

package mypackage;

import java.util.ArrayList;
import java.util.Collections;
import org.junit.Test;
import static org.junit.Assert.*;

public class MyClassTest {

    public MyClassTest() {
    }

    @Test
    public void testSolutionLong_RandomAllUnique() {
        ArrayList array = new ArrayList();
        for(int i = -1000000; i < 1000000; i++) {
            array.add(i);
        }
        Collections.shuffle(array);
        assertEquals(100000, MyClass.solution(array.subList(0, 100000)));

    }  
}
java python python-3.x bit-shift
1个回答
1
投票

只需尝试直接回答您提出的问题。回答Python为什么要花9秒而Java要快50倍,这不是一个简单的问题。在这里,您可以深入了解先例讨论Is Python slower than Java/C#?

© www.soinside.com 2019 - 2024. All rights reserved.