>  기사  >  백엔드 개발  >  Python은 ctypes를 사용하여 실행 속도를 향상시킵니다.

Python은 ctypes를 사용하여 실행 속도를 향상시킵니다.

大家讲道理
大家讲道理원래의
2016-11-10 15:06:141583검색

ctypes 라이브러리를 사용하면 개발자가 C 언어의 도움으로 개발할 수 있습니다. C 언어를 도입한 이 인터페이스는 성능 향상을 위해 C 코드를 호출해야 하는 몇 가지 작은 문제와 같은 많은 작업을 수행하는 데 도움이 될 수 있습니다. 이를 통해 Windows 시스템에서는 kernel32.dll 및 msvcrt.dll 동적 링크 라이브러리에 액세스하고 Linux 시스템에서는 libc.so.6 라이브러리에 액세스할 수 있습니다. 물론, 자신만의 컴파일된 공유 라이브러리를 사용할 수도 있습니다

먼저 간단한 예를 살펴보겠습니다. Python을 사용하여 1,000,000 내의 소수를 찾고 이 과정을 10번 반복한 후 실행 시간을 계산합니다.

공급자 및 메모

SQLite는 Android에서 일반적으로 사용되는 데이터 저장 방법으로 데이터베이스 데이터에 액세스할 때 SQLiteOpenHelper를 사용해야 합니다.

좋은 데이터베이스 연결 코드는 다음 문제를 해결할 수 있어야 합니다. a) 인스턴스 구축은 상대적으로 리소스 집약적입니다. b) 데이터베이스 연결을 재사용하는 것이 가장 좋습니다. c) OnUpdate 및 기타 메서드는 다른 인스턴스와 결합할 수 없습니다. 실행 충돌 중.

이렇게 쉽게 작성할 수 있습니다

Suppliers.memoize(new Supplier() { @Override public SQLiteOpenHelper get() { return new ...;
  }
})

Guava에서 제공하는 보조 메소드를 사용하여Supplier, Memoize, 로직을 구현한 코드입니다. 이름에서 알 수 있듯이 공급자는 일반적으로 공장, 발전기, 건축업자 및 폐쇄자로 사용됩니다. Memoize는 캐시의 개념과 유사합니다. 일단 인스턴스를 생성하면 후속 호출에서 동일한 인스턴스를 반환하며 스레드로부터 안전합니다.

이와 같이 작성하면 여러 가지 장점이 있습니다. 첫째, 필요할 때만 인스턴스를 빌드하고 처음에 프로그램 실행을 차단하지 않습니다. 둘째, 메모이즈를 사용하여 캐싱을 구현하므로 하나만 존재합니다. 인스턴스 생성.

코드 삽입

Glow는 코드 삽입을 많이 사용하는 프로그램으로, 코드를 더욱 체계적이고 명확하며 단순하게 만드는 동시에 개발 시간도 많이 절약해줍니다.

Dagger 2는 주입을 위한 도구입니다. 관심 있는 학생들은 웹사이트를 방문하여 관련 콘텐츠에 대해 자세히 알아보세요. 주입 외에도 캐싱을 구현하는 데 사용할 수 있는 몇 가지 보너스 기능이 있으며 몇 가지 추가 주석이나 인터페이스만 사용하면 됩니다.

@Singleton

이것은 모두가 면접에서 자주 묻는 질문이라고 생각합니다. 쉽게 말하면 싱글톤이다. 왜냐하면 이를 사용하면 더 이상 이러한 인스턴스를 캐시하는 방법에 대해 걱정할 필요가 없기 때문입니다.

@Singleton public class SingletonClass {  
}

@Reusable

이것은 새롭고 멋진 기능입니다. 싱글톤도 좋지만 때로는 인스턴스가 너무 커서 항상 메모리에 저장되고, 당분간 프로그램에서 사용되지 않을 수 있으므로 어찌됐든 조금 낭비적인 느낌이 들 수 있습니다. 대부분의 경우 인스턴스가 하나만 필요할 정도로 엄격한 요구 사항이 없습니다. 재사용할 수 있으면 재사용하세요. [이메일 보호] 시나리오에서는 이미 생성된 인스턴스가 있으면 다시 인스턴스화할 수 없습니다. 이며 보증이 필요하지 않습니다.

@Reusable public class ReusableClass {  
}

Lazy

Lazy를 사용하는 곳은 앞선 두 곳과 조금 다릅니다. @Singleton과 @Reusable은 주로 Provide나 Type 정의에 사용되지만, Lazy를 사용하면 처음에 언급한 공급자와 Memoize와 사용 효과가 유사하다.

@Inject Lazy lazySQLiteOpenHelper;

lazySQLiteOpenHelper.get() 호출을 시작할 때까지 SQLiteOpenHelper 인스턴스는 여기에서 생성되지 않습니다. 첫 번째 인스턴스화가 완료되면 후속 호출은 첫 번째 결과를 반환합니다.

관찰 가능

앱을 사용하는 과정에서 서버에서 많은 양의 데이터를 가져와야 합니다. 우리 앱에서는 매일 사용자에게 맞춤형 콘텐츠를 제공합니다. 이 콘텐츠는 단기간에 변경되지 않습니다. 매번 서버에서 검색하는 데 시간이 너무 많이 걸리지만 저장하기는 쉽지 않은 것 같습니다. 데이터베이스나 파일과 같은 영구 저장소에 필요합니다. 모든 것을 고려해보면 메모리 캐싱이 좋은 선택인 것 같습니다.

그래서 이 캐시는 우선 다음과 같은 기능을 제공해야 합니다. 둘째, 여러 곳에서 사용해야 하기 때문에 구조가 매우 단순해야 합니다. 셋째, 스레드여야 합니다. -안전한.

나중에 Retrofit과 Observable에서 제공하는 몇 가지 방법을 사용하여 구현 계획이 매우 간단해졌습니다.

private static final long EXPIRE_MS = 5 * 60 * 1000; private Pair<Long, Observable>
cache; public synchronized Observable getDailyContent() { if (cache == null || cache.first + EXPIRE_MS < System.currentTimeMillis()) {
      cache = Pair.create(System.currentTimeMillis(), serverApi.getContent());
    } return cache.second;
  }

이 방법의 핵심은 Retrofit에서 반환한 Observable 객체를 사용하는 것이며 Observable은 캐시와 유사한 캐시 방법을 제공하므로 구독 전에 네트워크 요청이 발행되지 않습니다. , 그러나 결과가 나오면 후속 호출자는 동일한 결과를 얻습니다.

참고

캐싱이 좋고 빠르고 사용하기 편리하지만, 사용 중에는 더티 데이터를 피하기 위해 모두가 데이터 업데이트 및 스레드 안전에 주의해야 합니다.

출처: http://www.jointforce.com/jfperitical/article/3516

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.